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

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  190  191  192  [193]  194  195  ...
NoWriterDateCnt.TitleFile(s)
127정성태3/29/200514572        답변글 VS.NET IDE: 28.4. [추가] SQL 2005 2005-02 CTP 버전에서 달라진 점
123정성태3/25/200518460    답변글 .NET Framework: 28.3. Uninstalling software without using Add Remove Programs...
108정성태3/4/200517934.NET Framework: 27. 시스템 이벤트 로그에 쌓이는 {00020906-0000-0000-C000-000000000046} 보안에러
107정성태3/1/200518145COM 개체 관련: 15. COM: Control 유형인 경우, IObjectWithSite 를 구현해도 SetSite/GetSite 가 호출이 안됨
106정성태2/28/200517439COM 개체 관련: 14. 탐색기 "처럼" 파일 열기
105정성태2/28/200516499.NET Framework: 26. VS.NET 2005 : 설치 프로젝트 - .NET Framework 설치 강제화
139정성태11/14/200514672    답변글 .NET Framework: 26.1. ^^ 역시, 배려가 되어 있네요. 제가 못 찾은 것이었습니다.
104정성태2/27/200517372VS.NET IDE: 23. MSI 설치 중에 GetLocalTime / GetSystemTime API 사용
132정성태3/30/200516992    답변글 VS.NET IDE: 23.1. [추가]: MSI 설치 동작 원리
102정성태2/16/200519655.NET Framework: 25. Verify that you are a member of the 'Debugger Users' group on the server. [2]
101정성태2/15/200517374.NET Framework: 24. WMI Win32_NTLogEvent 관리 이벤트를 Windows 2000 에서는 "Access Denied" 가 발생하는 문제파일 다운로드1
100정성태2/15/200523462VS.NET IDE: 22. 방화벽 환경에서의 WMI 연결을 위한 포트 설정 [2]
99정성태2/15/200521497COM 개체 관련: 13. 비동기 Drag & Drop 구현 : IAsyncOperation
103정성태2/23/200517695    답변글 COM 개체 관련: 13.1. [관련 자료] 그외 Drag & Drop 링크파일 다운로드1
97정성태2/14/200520651VS.NET IDE: 21. 설치된 Platform SDK 버전확인 방법
96정성태2/14/200522672기타: 9. http://www.google.com/webhp?complete=1&hl=en 검색에 관해서.
95정성태2/14/200532010VS.NET IDE: 20. Win32 특권 정리 [1]
94정성태1/29/200523314VC++: 13. VS.NET 2005 VC++ 컴파일러 에러 : cannot instantiate abstract class
93정성태1/29/200519214VS.NET IDE: 19. 혹시 VS.NET 2005 Beta2(2004/12 CTP Team System 버전)이 다운이 자주 되나요? [2]
92정성태1/29/200518031.NET Framework: 23. Unmanaged 환경에서 Managed DLL에 정의된 메서드 호출 시 오류 확인하는 방법
91정성태11/14/200518656VC++: 12. VS.NET 2005 VC++ Debug: Expression: ( (state != ST_INVALID ) )
90정성태1/27/200519466.NET Framework: 22. Debug: The underlying connection was closed: Unable to connect to the remote server.
89정성태1/26/200523956VC++: 11. Delay Loaded DLL
87정성태1/23/200517513VS.NET IDE: 18. VS.NET 2005 Beta 1 - VC++ 프로젝트에서 Connection Point 구현시 버그
88정성태1/23/200517238    답변글 VS.NET IDE: 18.1. VS.NET 2003 : VC++ 프로젝트에서 Connection Point 추가시에도 버그
86정성태1/23/200522966.NET Framework: 21. Code Snippet - Enum과 관련된 다양한 형변환 [1]
... 181  182  183  184  185  186  187  188  189  190  191  192  [193]  194  195  ...