가장 최근 편집 내용은 굵게 표시.
.net HttpListener
클래스를 사용하고 있지만, 이 응용 프로그램을 IIS에서 실행하지 않을 것이며 ASP.net을 사용하지 않을 것입니다. 이 웹 사이트에서는 asp.net으로 SSL을 구현하기 위해 실제로 사용할 코드를 설명하고 이 사이트에서는 인증서를 설정하는 방법을 설명합니다(IIS에서만 작동하는지 여부는 확실하지 않습니다).
클래스 문서에는 다양한 인증 유형(기본, 다이제스트, Windows 등)이 설명되어 있지만 SSL에 대해서는 언급되어 있지 않습니다. HTTPS를 사용하는 경우 서버 인증서를 설정해야 합니다]3라고 나와 있습니다. 이것은 한 줄의 속성 설정이고 나머지는 HttpListener
가 알아서 처리하는 건가요?
간단히 말해 인증서를 설정하는 방법과 SSL을 구현하기 위해 코드를 수정하는 방법을 알아야합니다.
HTTPS에 액세스하려고 할 때는 발생하지 않지만 시스템 이벤트 로그에서 오류를 발견했습니다. 소스는 'Schannel'이고 메시지 내용은 다음과 같습니다:
SSL에 액세스하려고 시도하는 동안 치명적인 오류가 발생했습니다. SSL 서버 자격 증명에 액세스하려고 할 때 치명적인 오류가 발생했습니다. 개인 키에 액세스하려고 할 때 치명적인 오류가 발생했습니다. 반환된 오류 코드는 다음과 같습니다. 암호화 모듈에서 반환된 오류 코드는 0x80090016입니다.
편집: 지금까지 취한 조치
질문
I have a 유사한 문제가 있는 것 자체에 문제가 있을 수 있는데, 인증서.
makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine
1, [지문] 보세요 백업하도록 인증서 복사합니다 클립보드가 및 제거 독창적이다. 이 후 다음 명령을 적립율은 매개변수입니다 - h:
HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755
서비스 및 작동하잖아 실행하십시오 호스트의 https://localhost:801/ 완벽하게.
내가 할 수 없다는 작동합니까 캐비닛용입니다 https 를 실행하기 위해 자체 생성 제공한다. # 39 의 코드 생성 here& I run to one (오류 처리 수행됨을 아웃해야 명확성을):
LPCTSTR pszX500 = subject;
DWORD cbEncoded = 0;
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
pbEncoded = (BYTE *)malloc(cbEncoded);
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
// Prepare certificate Subject for self-signed certificate
CERT_NAME_BLOB SubjectIssuerBlob;
memset(&SubjectIssuerBlob, 0, sizeof(SubjectIssuerBlob));
SubjectIssuerBlob.cbData = cbEncoded;
SubjectIssuerBlob.pbData = pbEncoded;
// Prepare key provider structure for self-signed certificate
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = NULL;
KeyProvInfo.dwProvType = PROV_RSA_FULL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_SIGNATURE;
// Prepare algorithm structure for self-signed certificate
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
memset(&SignatureAlgorithm, 0, sizeof(SignatureAlgorithm));
SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA;
// Prepare Expiration date for self-signed certificate
SYSTEMTIME EndTime;
GetSystemTime(&EndTime);
EndTime.wYear += 5;
// Create self-signed certificate
pCertContext = CertCreateSelfSignCertificate(NULL, &SubjectIssuerBlob, 0, &KeyProvInfo, &SignatureAlgorithm, 0, &EndTime, 0);
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");
CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0);
또한 개인 키, 가 아니라 https 인증 fs@snapa 제대로 작동하는 것처럼 시간초과를 지문 등록 수 없었다. 만약 누군가 그 이유를 알 - 셀명 plz
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = _T("Microsoft RSA SChannel Cryptographic Provider");
KeyProvInfo.dwProvType = PROV_RSA_SCHANNEL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
방금 %s/dbase/ext_table. 인증서 바인딩하려면 충족되었으며 ip :포트 그리곤요 open your 리스너에 https:// 로 접두어입니다. # 39 의 모든 ip& 0.0.0.0 적용됩니다. guid 는 응용 프로그램 id 는 임의의 임의적입니까, 인증서 및 체사시 해시라고 (트럼프린트 라고도 함).
관리자 권한을 사용하여 cmd. exe 를 사용하여 다음과 같이 실행하십시오.
netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}
이 직접 서명한 인증서 테스트하려면 만들려면,
하트프리스트너 리스너에 = new 하트프리스트너 (); 리스너에. 프레피스에스트라다 (https://+:1234/" ";). 리스너에. 시작 (); 콘솔드라이틀린 (Listening." ";). 하트프리스트너콘테스트 컨텍스트로 = 리스너에. 제콘테스트 ();
사용 (스트리밍합니다 스트리밍합니다 = 컨텍스트입니다. 레스폰지지우스푸트스트림) 사용 (스트림라이터 작성기에 = new 스트림라이터 (stream)) 기록기입니다. 쓰기 (누구없어요, https world" ";).
콘솔트레더라인 ();
이 프로그램을 실행할 수 있도록 한 후 1234년 '그냥' https://localhost: 볼 수 있는 텍스트 인쇄되었습니다. 이후 인증서 CN 일치하지 않는 것은 신뢰할 수 있는 url 과 인증서 저장소를 인증서 경고야 경험할 수 있습니다. 그러나 같은 도구를 통해 확인할 수 있듯이 텍스트 암호화됩니다 와이어 Shark.
Openssl 은 자체 서명된 x509 인증서 확인표시를 보다 효과적으로 제어할 수 있는 좋은 이유가 있고 도구에서는 포트 windows*용. # 39, 이를 통해 보다 더 많은 성공을 마이크스트 도구에서는 i& 숨기지 않았다.
또한 매우 중요한 것이 it& # 39 의 경우에는 https 를 사용하면 코드를 가지고 있는 통신 서비스를 기반으로 이 서비스에 대한 경고, ssl 인증서 문법검사기 무시하려면 지점임 관리자에서는 설치 합니다 이 테스트를 위해.
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
다음은 바인딩해야 수 있는 또 다른 방법으로는 SSL 스트리피아티 IP / 포트 조합으로의 하토프스프고드레스 ' (XP)' 또는 '네스트레서 사용하지 않고' (Vista+).
http://dotnetcodebox.blogspot.com.au/2012/01/how-to-work-with-ssl-certificate.html
사용할 수 있는 것이 골자로 C++ 프로그래밍 방식으로 windows 를 내장한 [하테프시체비스콘피그라티온] [2] API 를 통해 이를 제거하는 데 대한 의존도 보다는 명령줄이, 업그레이드됨 OS 와 하토프스프트 설치되었음.
[2]: 이아스파스 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364503 (v = vs. 85)
클래스 문서]1
에는 이 메모가 있습니다:
다음을 사용하여 HttpListener를 만드는 경우 https, 해당 리스너에 대한 서버 해당 리스너에 대한 인증서. 그렇지 않으면 다음과 같은 HttpWebRequest 쿼리가 발생합니다. 이 Http 리스너는 실패합니다. 예기치 않은 연결 종료가 발생합니다.
그리고 이것:
서버 인증서 구성 가능 및 기타 리스너 옵션을 구성할 수 있습니다.
HttpCfg.exe. 참조 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp 를 참조하세요. 실행 파일은 Windows Server 2003과 함께 제공되거나 소스 코드에서 빌드할 수 있습니다. 플랫폼 SDK에서 사용할 수 있습니다.
첫 번째 메모가 두 번째 메모에 의해 설명되나요? 질문에서 설명한 대로 저는 httpcfg.exe를 사용하여 인증서를 특정 포트에 바인딩했습니다. 이 이외의 다른 것을 의도한 것이라면 메모가 모호합니다.