Microsoft MVP성태의 닷넷 이야기
.NET Framework: 859. C# - HttpListener를 이용한 HTTPS 통신 방법 [링크 복사], [링크+제목 복사]
조회: 1077
글쓴 사람
홈페이지
첨부 파일
 

C# - HttpListener를 이용한 HTTPS 통신 방법

아래와 같은 질문이 있군요. ^^

윈도우10 SSL 통신 문의
; https://social.msdn.microsoft.com/Forums/ko-KR/cc45c1ae-3a8c-4fcc-a307-552053164822/50952460205086410-ssl-5368549888-4792851032?forum=dotnetko

질문 내용으로만 봤을 때는 코드나 환경 구성이 생략되어 있어 해결책을 제시할 수는 없습니다. 대신 실제로 한 번 통신이 되도록 구성하는 과정을 살펴보면 답이 나오겠죠? ^^




그러고 보니, 예전에 HttpListener 타입의 사용법을 설명한 적이 있습니다.

IIS의 80 포트를 공유하는 응용 프로그램 만드는 방법
; https://www.sysnet.pe.kr/2/0/1555

이 예제를 그대로 HTTPS 통신이 가능하도록 확장해 보겠습니다. 우선, https 통신을 위한 포트를 50443 번으로 정하겠습니다. 당연히 (관리자 권한으로 실행할 것이 아니라면) 포트 등록을 미리 해둬야 하는데 http 포트 경로를 예약했던 것과 동일한 방식으로 다음과 같이 할 수 있습니다.

[등록]
netsh http add urlacl url=https://+:50443/MyTemp/ user=testuser

[삭제]
netsh http delete urlacl url=https://+:50443/MyTemp/

그다음, https 통신을 위한 인증서를 등록해야 하는데 아래의 설명에 따라,

윈도우에서 (테스트) 인증서 파일 만드는 방법
; https://www.sysnet.pe.kr/2/0/12013

다음과 같이 실행해 주면,

c:\temp> makecert -sr LocalMachine -pe -ss My -n "CN=localhost" -r mycert.cer
Succeeded

"Local Computer" / "Personal" / "Certificates" 영역에 인증서가 등록됩니다. 이와 함께 (시작 메뉴에서 "Manage computer certificates"을 입력해) 인증서 관리자를 실행한 후 "Personal" / "Certificates" 경로에 방금 생성해서 등록된 "localhost" 인증서를 "Trusted Root Certification Authorities" / "Certificates" 하위에 복사해 줍니다.




남은 작업으로, 시스템에 등록한 인증서를 https 포트와 연결해야 하는데 다음과 같이 netsh 명령어를 실행해 주면 됩니다.

netsh http add sslcert ipport=0.0.0.0:50443 certhash=[...인증서_thumbprint...] appid={...임의guid값...}

이중에서 "인증서_thumbprint" 값은 인증서의 속성을 통해 구할 수 있고,

cert_thumbprint_1.png

appid는 임의 값을 생성해 전달하면 됩니다. 가령, 제가 만든 "CN=localhost" 테스트 인증서는 thumbprint 값이 "f6b02518e052f53822aa15cf5a274353166981d1"이므로 다음과 같이 수행할 수 있습니다.

C:\Windows\System32>netsh http add sslcert ipport=0.0.0.0:50443 certhash=f6b02518e052f53822aa15cf5a274353166981d1 appid={50758B78-5A23-43DB-A87D-FBA032394122}

휴~~~~ 이제야 모든 환경 구성이 끝났습니다. 마지막으로 HttpListener를 사용한 C# 코드는 다음과 같이 한 줄만 추가하면 됩니다.

static void Main(string[] args)
{
    HttpListener httpServer = new HttpListener();
    httpServer.Prefixes.Add("http://+:80/MyTemp/");
    httpServer.Prefixes.Add("https://+:50443/MyTemp/");
            
    httpServer.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
    httpServer.Start();

    httpServer.BeginGetContext(ProcessRequest, httpServer);

    Console.ReadLine();
}

간단하죠? ^^ 웹 브라우저를 이용해 "https://localhost:50443/MyTemp"로 접속해 보면 정상적으로 통신이 되는 것을 확인할 수 있습니다.

(이 글의 소스 코드는 DotNetSamples/WinConsole/HttpListenerAsHttps - github에 등록되어 있습니다.)




netsh 수행 시 다음과 같은 오류가 발생한다면?

C:\Windows\System32>netsh http add urlacl url=http://+:80/MyTemp/ user="testuser"
Create SDDL failed, Error: 1332
 The parameter is incorrect.

user 인자에 전달한 계정(위의 경우 testuser)이 해당 시스템에 있는지 확인해 볼 필요가 있습니다. 아마도 등록되지 않은 계정명을 전달했을 가능성이 높습니다.




본문에서, 테스트 인증서를 "Personal"에도 등록하고 "Trusted Root Certification Authorities"에도 등록했는데요. 원래 정상적인 인증서라면 "Personal"에만 등록해도 상관없습니다. 단지, 테스트 인증서이기 때문에 유효하지 않으므로 스스로를 "Trusted Root..." 영역에 등록함으로써 유효한 인증서로 명시해야 할 필요가 있었던 것입니다. 그렇다면 애당초 인증서를 "Trusted Root Certification Authorities"에만 등록해도 괜찮지 않을까요? 아쉽게도 그런 경우 netsh 명령어는 다음과 같은 식의 오류를 냅니다.

SSL Certificate add failed, Error: 1312
A specified logon session does not exist. It may already have been terminated.

왜냐하면, netsh 명령어는 인증서를 "Trusted Root Certification Authorities" 영역이 아닌, "Personal" 영역에서 찾기 때문입니다. 따라서, "Local Computer / Personal / Certificates" 영역에도 동일한 인증서를 등록해야 합니다. 그러고 보니, 아래의 경우에도,

ASP.NET Core를 docker에서 실행 시 "Failed with a critical error." 오류 발생
; https://www.sysnet.pe.kr/2/0/11707

"Personal"과 "Trusted Root Certification Authorities" 2곳에 모두 등록했던 적이 있었군요. ^^




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





[최초 등록일: ]
[최종 수정일: 8/29/2019 ]

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

비밀번호

댓글 쓴 사람
 




1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
11933정성태6/7/20191271VC++: 132. enum 정의를 C++11의 enum class로 바꿀 때 유의할 사항파일 다운로드1
11932정성태6/7/20191010오류 유형: 544. C++ - fatal error C1017: invalid integer constant expression파일 다운로드1
11931정성태6/6/20191151개발 환경 구성: 441. C# - CairoSharp/GtkSharp 사용을 위한 프로젝트 구성 방법
11930정성태6/26/20191430.NET Framework: 842. .NET Reflection을 대체할 System.Reflection.Metadata 소개
11929정성태6/5/2019984.NET Framework: 841. Windows Forms/C# - 클립보드에 RTF 텍스트를 복사 및 확인하는 방법
11928정성태6/5/20191001오류 유형: 543. PowerShell 확장 설치 시 "Catalog file '[...].cat' is not found in the contents of the module" 오류 발생
11927정성태6/5/20191216스크립트: 15. PowerShell ISE의 스크립트를 복사 후 PPT/Word에 붙여 넣으면 한글이 깨지는 문제 [1]
11926정성태6/4/20191364오류 유형: 542. Visual Studio - pointer to incomplete class type is not allowed
11925정성태6/4/20191349VC++: 131. Visual C++ - uuid 확장 속성과 __uuidof 확장 연산자파일 다운로드1
11924정성태5/30/20191437Math: 57. C# - 해석학적 방법을 이용한 최소 자승법 [1]파일 다운로드1
11923정성태5/30/20191209Math: 56. C# - 그래프 그리기로 알아보는 경사 하강법의 최소/최댓값 구하기파일 다운로드1
11922정성태5/30/2019861.NET Framework: 840. ML.NET 데이터 정규화파일 다운로드1
11921정성태5/28/20191317Math: 55. C# - 다항식을 위한 최소 자승법(Least Squares Method)파일 다운로드1
11920정성태5/28/2019991.NET Framework: 839. C# - PLplot 색상 제어
11919정성태5/27/20191275Math: 54. C# - 최소 자승법의 1차 함수에 대한 매개변수를 단순 for 문으로 구하는 방법 [1]파일 다운로드1
11918정성태5/27/20191373Math: 53. C# - 행렬식을 이용한 최소 자승법(LSM: Least Square Method)파일 다운로드1
11917정성태5/24/20191304Math: 52. MathNet을 이용한 간단한 통계 정보 처리 - 분산/표준편차파일 다운로드1
11916정성태5/24/2019925Math: 51. MathNET + OxyPlot을 이용한 간단한 통계 정보 처리 - Histogram파일 다운로드1
11915정성태5/24/2019997Linux: 11. 리눅스의 환경 변수 관련 함수 정리 - putenv, setenv, unsetenv
11914정성태5/24/20191470Linux: 10. 윈도우의 GetTickCount와 리눅스의 clock_gettime파일 다운로드1
11913정성태5/24/2019982.NET Framework: 838. C# - 숫자형 타입의 bit(2진) 문자열, 16진수 문자열 구하는 방법파일 다운로드1
11912정성태5/23/2019914VS.NET IDE: 137. Visual Studio 2019 버전 16.1부터 리눅스 C/C++ 프로젝트에 추가된 WSL 지원
11911정성태5/23/2019996VS.NET IDE: 136. Visual Studio 2019 - 리눅스 C/C++ 프로젝트에 인텔리센스가 동작하지 않는 경우
11910정성태5/24/20191970Math: 50. C# - MathNet.Numerics의 Matrix(행렬) 연산파일 다운로드1
11909정성태5/25/20191435.NET Framework: 837. C# - PLplot 사용 예제 [1]파일 다운로드1
11908정성태5/22/2019950.NET Framework: 836. C# - Python range 함수 구현파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...