Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기
(연관된 글이 7개 있습니다.)

8.1 WCF에 SSL 적용 (1) - Httpcfg.exe 도구를 이용한 SSL 설정


WCF의 HTTP 기능은 http.sys와 통합되어졌다고 합니다. 내부적으로 어떤 메카니즘으로 통합이 이루어져 있는지는 아직 제가 공부가 덜 되어서 파고 들어본 적은 없지만 ^^; 암튼 문서상으로만 그렇다고 알고 있습니다. 혹시 이 부분에 대해 심도 있게 알고 계신 분이 있다면 블로그 토픽으로 좀 써주시면 링크하도록 하겠습니다.

그런 이유로 인해, WCF의 Endpoint로 SSL 적용을 하고 싶다면 http.sys에게 관련 설정값을 알려줘야 합니다. 실제로 "18.2. 웹 사이트에 SSL을 적용" 토픽을 보시면 아시겠지만, IIS 관리자에서도 SSL 통신을 설정하는 부분에 있어서는 "인증서"와 "SSL 적용 포트"를 알려주도록 되어 있습니다. "WWW 서비스"도 결국 http.sys를 이용하는 하나의 클라이언트라고도 볼 수 있는데요.

WWW 서비스는 IIS 관리자를 통해서 "포트"와 "인증서"를 설정하는 것이 가능하지만, WCF와 같은 외부 프로그램들이 특정 포트에 대해서 사용하려는 인증서를 매핑하고 싶다면 어찌해야 할까요? 나아가서 IIS에 SSL 웹 사이트 설정을 사용자 관여 없이 자동으로 셋업 과정 등에서 하고 싶다면 어찌해야 할까요? 그렇습니다. 바로 이런 경우를 위해서 httpcfg.exe 도구가 있는 것입니다. 참고로 Vista / Longhorn 같은 경우에는 이러한 설정을 명령행에서 할 수 있도록 "netsh"이 확장되었습니다.

Windows XP/2003에서 httpcfg.exe를 사용하기 위해서는 "Windows Support Tools"를 다운로드 받으면 됩니다. 그 안에 "httpcfg.exe" 프로그램이 포함되어 있기 때문입니다. "Windows Support Tools"는 다음의 경로에서 무료로 다운로드 받을 수 있습니다.

Windows Server 2003 Service Pack 1 32-bit Support Tools
; http://www.microsoft.com/downloads/details.aspx?familyid=6EC50B78-8BE1-4E81-B3BE-4E7AC4F0912D&displaylang=en

Windows XP Service Pack 2 Support Tools
; http://www.microsoft.com/downloads/details.aspx?FamilyId=49AE8576-9BB9-4126-9761-BA8011FABF38&displaylang=en

구체적인 HttpCfg.exe에 대한 도움말은 다음의 사이트를 참조하십시오.

Httpcfg.exe: HTTP Configuration Utility
; http://technet2.microsoft.com/WindowsServer/en/library/e17527d2-105a-451f-8e3f-d515479527011033.mspx

원한다면 HttpCfg.exe에 대한 C/C++ 소스 파일도 구할 수 있습니다. 혹시나, 다음의 토픽을 읽어보신 분은 해당 STS 예제 다운로드 파일 안에 "httpcfg.exe"가 소스와 함께 공개되어 있다는 것을 아실 것입니다.

11.3.2 Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현
; https://www.sysnet.pe.kr/2/0/385



자, 그럼 이제 httpcfg.exe 파일을 구했으니 여러분들이 서비스 하기를 원하는 포트에 대해서 인증서를 매핑하기 위해 실제로 httpcfg.exe를 사용해서 실습을 해보도록 하겠습니다.

[포트에 대해 인증서 설정]

1. 명령어 형식은 다음과 같습니다.

httpcfg set ssl -i [바인딩 IP]:[포트번호] -h [인증서Thumbprint값]

대개의 경우 바인딩될 IP는 IIS 관리자에서 하듯이 모든 IP에 대해서 가능하도록 하기 위해 "All unsigned"라는 의미로 "0.0.0.0" 값을 쓰게 될 것입니다. 포트 번호는 여러분들이 원하는 값을 넣으면 될 테고요. 문제는 "인증서 Thumbprint값"입니다.

결국, 이번 토픽도 이렇게 해서 "인증서 서비스"와 관련이 있게 됩니다. 계속해서 실습을 하기 위해서는 아래의 토픽을 읽어보시고 '인증서 서비스'와 '서버 인증서'를 받아두셔야 합니다.

18.1 윈도우즈 인증서 서비스 설치 
; https://www.sysnet.pe.kr/2/0/354

18.2. 웹 사이트에 SSL을 적용 
; https://www.sysnet.pe.kr/2/0/372

2. 위와 같이 해서 "서버 인증서"를 구하셨으면 이제 해당 서버 인증서의 "등록 정보" 창을 열어 봅니다. 그럼, 아래와 같은 화면이 나오게 되는데, 보시는 것처럼 "Thumbprint" 값이 설정되어져 있는 것을 알 수 있습니다.

Thumbprint 값 확인

참고로, WCF에서 위의 "Thumbprint" 값을 사용하기 위해서는 반드시 "Thumbprint alogorithm" 값이 "sha1"이어야 한다고 합니다. 만약 "MD5"가 사용되었다면... ^^; 일단 한번 해보시고 안되면 다시 받으십시오.

위의 그림에서 "Thumbprint" 값을 조합해 보면 "0a8a131bb6dbbfc46e6c1022921512a60b0ea005"가 되겠습니다. 이제 모든 준비는 끝났습니다. 만약 여러분들이 서비스할 WCF 서버 응용 프로그램이 사용할 포트가 "9094"라면 다음과 같이 실행하실 수 있습니다.

httpcfg set ssl -i 0.0.0.0:9094 -h 0a8a131bb6dbbfc46e6c1022921512a60b0ea005




[설치된 인증서 확인]

"httpcfg set ssl" 명령을 통해서 실제로 인증서가 정상적으로 설치되었는지 확인하기 위해서는 "httpcfg query ssl" 명령을 사용하시면 됩니다. 실제로 다음과 같이 나오는 것을 확인할 수 있습니다.

D:\...>httpcfg query ssl
    IP                      : 0.0.0.0:443
    Hash                    :  a8a131bb6dbbfc46e6c1022921512a6 b ea0 5
    Guid                    : {4dc3e181-e14b-4a21-b022-59fc669b0914}
    CertStoreName           : MY
    CertCheckMode           : 0
    RevocationFreshnessTime : 0
    UrlRetrievalTimeout     : 0
    SslCtlIdentifier        :
    SslCtlStoreName         :
    Flags                   : 0
------------------------------------------------------------------------------
    IP                      : 0.0.0.0:9094
    Hash                    :  a8a131bb6dbbfc46e6c1022921512a6 b ea0 5
    Guid                    : {00000000-0000-0000-0000-000000000000}
    CertStoreName           : (null)
    CertCheckMode           : 0
    RevocationFreshnessTime : 0
    UrlRetrievalTimeout     : 0
    SslCtlIdentifier        : (null)
    SslCtlStoreName         : (null)
    Flags                   : 0
------------------------------------------------------------------------------




[설치된 인증서 삭제]

굳이 이 정도까지는 설명드리지 않아도 이미 "httpcfg.exe" 실행을 통해서 나오는 도움말에 대해서 대강 숙지를 하셨을 텐데요. 그래도 한번 설명을 드려보자면, 다음과 같은 명령을 통해서 인증서 설정을 삭제할 수 있습니다.

D:\...>httpcfg delete ssl -i 0.0.0.0:9094
HttpDeleteServiceConfiguration completed with 0.

D:\...>httpcfg query ssl
    IP                      : 0.0.0.0:443
    Hash                    :  a8a131bb6dbbfc46e6c1022921512a6 b ea0 5
    Guid                    : {4dc3e181-e14b-4a21-b022-59fc669b0914}
    CertStoreName           : MY
    CertCheckMode           : 0
    RevocationFreshnessTime : 0
    UrlRetrievalTimeout     : 0
    SslCtlIdentifier        :
    SslCtlStoreName         :
    Flags                   : 0
------------------------------------------------------------------------------



마지막으로, 만약 여러분들이 httpcfg.exe를 통해서 정상적으로 SSL 인증서를 설정하지 않은 체로 WCF와 같은 서비스에서 HTTPS 통신을 하려고 하면 클라이언트 측에서 다음과 같은 오류가 발생하게 됩니다.

Unhandled Exception: System.ServiceModel.CommunicationException: An error occurred while making the HTTP request to https://sedona:9094/HelloService. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: Authentication failed because the remote party has closed the transport stream.
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   [이하 생략...]
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace:
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   [이하 생략...]
Press any key to continue . . .




[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/22/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  142  143  [144]  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1454정성태5/31/201326230Java: 15. Java 7 Control Panel 실행시키는 방법
1453정성태5/22/201325267기타: 32. Microsoft FTP 사이트에 접속하는 방법
1452정성태5/21/201332961Windows: 73. TabProcGrowth 값 삭제 후 IE를 실행시키면 다시 복원되는 경우 [3]
1451정성태5/17/201331892Windows: 72. 윈도우 서버 2012 기초 사용법
1450정성태5/16/201322716오류 유형: 176. SQL10007N Message "0" could not be retrieved. Reason code: "3"
1449정성태5/15/201329830오류 유형: 175. SpeechRecognitionEngine 사용 시 오류 유형 2가지
1448정성태5/14/201324816VC++: 68. #pragma warning(disable: ...)로 오류 제어가 안된다면?
1447정성태5/3/201326482개발 환경 구성: 191. Debugging Tools for Windows 독립 설치 버전 [1]
1446정성태4/30/201327252.NET Framework: 368. Encoding 타입의 대체(fallback) 메카니즘 [1]
1445정성태4/26/201325470디버깅 기술: 54. NT 서비스의 Main 메서드 안에서 Process.GetProcessesByName 호출 시 멈춤 현상 [1]
1444정성태4/26/201329494기타: 31. Internet Explorer: 자바스크립트로 숨겨진 파일 다운로드 경로를 알아내는 방법 [1]
1443정성태4/24/201325163개발 환경 구성: 190. Azure PaaS 웹 응용 프로그램 배포 후 SMTP 서버 구성 [2]
1442정성태4/21/201328747기타: 30. 마이크로소프트 워드의 CPU 점유 현상으로 글자 입력이 느려졌다면? [1]
1441정성태4/21/201335344.NET Framework: 367. LargeAddressAware 옵션이 적용된 닷넷 32비트 프로세스의 가용 메모리 [14]
1440정성태4/19/201324079오류 유형: 174. dumpbin.exe 실행시 mspdb110.dll 로드 오류
1439정성태4/18/201327943VS.NET IDE: 76. Visual Studio 2012와 Itanium 빌드 옵션 [2]
1438정성태4/17/201327331.NET Framework: 366. 다른 프로세스에 환경 변수 설정하는 방법 - 두 번째 이야기 [1]파일 다운로드1
1437정성태4/17/201327556VC++: 67. CRT(C Runtime DLL: msvcr...dll)에 대한 의존성 제거
1436정성태4/17/201332975.NET Framework: 365. Local SYSTEM 권한으로 코드를 실행하는 방법파일 다운로드1
1435정성태4/15/201341858Windows: 71. ad-hoc 보다 더 편리한 "가상 Wifi" 를 이용한 인터넷 공유 [2]
1434정성태4/9/201323126오류 유형: 173. TFS 서버의 이벤트 로그 오류 - WebHost failed to process a request. Parameter name: certificate
1433정성태4/9/201323420개발 환경 구성: 189. TFS에 설치된 SharePoint 의 PowerShell 콘솔 띄우는 방법
1432정성태4/5/201324429오류 유형: 172. System.Web.PipelineModuleStepContainer.GetEventCount 에서 NullReferenceException 이 발생한다면?
1431정성태4/5/201325067기타: 29. 부팅 가능한 (외장) HDD를 기존 부팅 메뉴에 추가하는 방법
1430정성태4/4/201326924제니퍼 .NET: 23. 모바일용 웹 사이트에서 발생하는 응답 시간 지연 현상 [5]파일 다운로드1
1429정성태3/29/201323292개발 환경 구성: 188. SCOM 2012 - ASP.NET 모니터링 방법
... 136  137  138  139  140  141  142  143  [144]  145  146  147  148  149  150  ...