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

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
14006정성태8/23/20254Linux: 121. Linux - snap 패키지 관리자로 설치한 소프트웨어의 디렉터리 접근 제한
14005정성태8/21/2025456오류 유형: 982. sudo: unable to load /usr/libexec/sudo/sudoers.so: libssl.so.3: cannot open shared object file: No such file or directory
14004정성태8/21/2025494오류 유형: 981. dotnet 실행 시 No usable version of the libssl was found
14003정성태8/21/2025599닷넷: 2357. C# 14 - (9) 새로운 지시자 추가 (Ignored directives)
14002정성태8/20/20251093오류 유형: 980. C# - appsettings.json 파일의 설정값이 적용 안 된다면?
14001정성태8/19/20251347닷넷: 2356. .NET SDK 10 - 단일 소스 코드 파일을 빌드/실행하는 기능을 "dotnet" 명령어에 추가
14000정성태8/18/20251136오류 유형: 979. ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
13999정성태8/15/20251431닷넷: 2355. C# 14 - (8) null 조건부 연산자 개선 - 대입문에도 사용 가능파일 다운로드1
13998정성태8/14/20251303닷넷: 2354. C# 14 - (7) 확장 메서드에 정적 메서드와 속성 지원을 위한 전용 구문 추가파일 다운로드1
13997정성태8/14/20251415Linux: 120. docker 컨테이너로 매핑된 볼륨에 컨테이너 측의 사용자 ID를 유지하면서 복사하는 방법
13996정성태8/13/2025965오류 유형: 978. Unable to find the requested .Net Framework Data Provider.
13995정성태8/13/2025963개발 환경 구성: 754. Visual C++ - 리눅스 빌드를 위한 Ubuntu 18 docker 컨테이너 설정
13994정성태8/12/2025925오류 유형: 977. SQL Server - User, group, or role '...' already exists in the current database. (Microsoft SQL Server, Error: 15023)
13993정성태8/11/20251451오류 유형: 976. Microsoft.ML.OnnxRuntimeGenAI 패키지 사용 시 "cublasLt64_12.dll" which is missing. (Error 126: "The specified module could not be found.") 오류
13992정성태8/11/20251597닷넷: 2353. C# - Foundry Local을 이용한 gpt-oss-20b 모델 사용파일 다운로드1
13991정성태8/9/20251428오류 유형: 975. winget - Foundry Local 패키지 업데이트가 안 되는 문제
13990정성태8/8/20251093Windows: 283. Time zone 설정이 없는 Windows Server 2025
13989정성태8/8/20251583닷넷: 2352. C# - Windows S-mode 환경인지 체크하는 방법파일 다운로드1
13988정성태8/8/20251705오류 유형: 974. 비주얼 스튜디오 업데이트 시 잠김 파일 경고 - Visual Studio Standard Collector Service 150 (VSStandardCollectorService150)
13987정성태8/7/20251355닷넷: 2351. C# 14 - (6) event와 생성자에도 partial 메서드 적용파일 다운로드1
13986정성태8/6/20251387닷넷: 2350. C# 14 - (5) 람다 매개 변수에 접근자가 있는 경우에도 타입 생략 가능파일 다운로드1
13985정성태8/6/20251916오류 유형: 973. "wsl --install" 명령어 수행 시 "The server name or address could not be resolved"
13984정성태8/6/20251611Windows: 282. 윈도우 운영체제에 추가된 ssh 서버(Win32-OpenSSH)
13983정성태8/4/20251867오류 유형: 972. Microsoft.Data.SqlClient 6.1.0 버전부터 .NET 8 이상만 지원
13982정성태8/2/20252035개발 환경 구성: 753. CentOS 7 컨테이너 내에서 openssh 서버 호스팅
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...