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

비밀번호

댓글 작성자
 




... 121  122  123  124  [125]  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10830정성태8/12/201525438개발 환경 구성: 275. Web.config이 적용되지 않는 프로젝트에서 Razor 템플릿 파일의 C# 컴파일러 버전 제어 [1]
10829정성태8/10/201527553개발 환경 구성: 274. PowerShell/명령행에서 JDK/JRE를 무인(unattended)/자동 설치를 하는 방법 [3]
10828정성태8/10/201533019웹: 30. Edge 브라우저에서 "이 웹 사이트에는 Internet Explorer가 필요함" 단계를 없애는 방법 [1]
10827정성태7/8/201533863개발 환경 구성: 273. Visual Studio 2015에서 Github와 연동하는 방법 [3]
10826정성태7/8/201524211오류 유형: 301. The trust relationship between this workstation and the primary domain failed. - 두 번째 이야기
10825정성태7/8/201522885개발 환경 구성: 272. Visual Studio IDE 설치 없이 Visual Studio SDK 설치하는 방법
10824정성태7/7/201528499개발 환경 구성: 271. Team Foundation Server 2015 설치 방법 [1]
10823정성태7/7/201529294오류 유형: 300. SqlException (0x80131904): Unable to open the physical file
10822정성태7/7/201528140오류 유형: 299. The 'Visual C++ Project System Package' package did not load correctly.
10821정성태7/7/201521191오류 유형: 298. Unable to start debugging on the web server. IIS does not list a web site that matches the launched URL.
10820정성태7/7/201526913오류 유형: 297. HTTP Error 503. The service is unavailable. - 두 번째
10819정성태7/2/201530073오류 유형: 296. SQL Server Express 시작 오류 - error code 3417
10818정성태7/1/201529237오류 유형: 295. HTTP Error 503. The service is unavailable. [1]
10817정성태6/29/201533191.NET Framework: 523. C# 람다(Lambda)에서 변수 캡처 방식 [3]
10816정성태6/25/201528974.NET Framework: 522. 닷넷의 어셈블리 서명 데이터 확인 방법파일 다운로드1
10815정성태6/23/201527403Graphics: 1. 자네 나와 함께... UNITY 하지 않겠는가! [4]
10814정성태6/22/201525128.NET Framework: 521. Roslyn을 이용해 C# 문법 변형하기 (2) [5]
10813정성태6/21/201526234.NET Framework: 520. Roslyn을 이용해 C# 문법 변형하기 (1)
10812정성태6/20/201527133.NET Framework: 519. C# 6.0 오픈 소스 컴파일러 Roslyn - 빌드 및 테스트 방법 [1]
10811정성태6/20/201524227오류 유형: 294. OpenAuth 사용 시 System.Data.SqlClient.SqlException 예외가 Output 창에 출력되는 문제
10810정성태6/18/201523717개발 환경 구성: 270. Visual Studio에서 github 오픈 소스를 fork해서 테스트하는 방법 [1]
10809정성태6/18/201521447.NET Framework: 518. AllowPartiallyTrustedCallers 특성이 적용된 GAC 어셈블리에서 DynamicMethod의 calli 명령어 사용파일 다운로드1
10808정성태6/17/201523536.NET Framework: 517. calli IL 호출이 DllImport 호출보다 빠를까요? [1]파일 다운로드1
10807정성태6/16/201524986.NET Framework: 516. Microsoft.AspNet.Membership.OpenAuth 사용 시 "Local Database Runtime error occurred" 오류
10806정성태6/16/201542345.NET Framework: 515. OpenAuth.VerifyAuthentication 호출 시 The remote server returned an error: (400) Bad Request
10805정성태6/15/201524142Java: 17. 자바의 재미있는 상수 처리 방식
... 121  122  123  124  [125]  126  127  128  129  130  131  132  133  134  135  ...