Как я добавляю SSL к приложению .NET, которое использует httplistener - это будет *не* работать на IIS

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
41
задан Trevor Reid 12 June 2019 в 13:38
поделиться

4 ответа

Мне еще не реализовали его полностью, но этот веб-сайт, кажется, дает хорошая пошаговая демонстрация из установки сертификатов и кода.

6
ответ дан pc1oad1etter 27 November 2019 в 00:56
поделиться

документация класса

имеет это примечание:

при создании HttpListener с помощью https необходимо выбрать Сертификат Сервера для того слушателя. Иначе запрос HttpWebRequest этого HttpListener перестанет работать с неожиданным завершением соединения.

и это:

можно настроить Сертификаты Сервера и другие опции слушателя при помощи HttpCfg.exe. См. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp для получения дополнительной информации. Исполняемый файл поставляется с Windows Server 2003 или может быть создан из исходного кода, доступного в SDK Платформы.

первое примечание объяснено вторым? Как обрисовано в общих чертах в вопросе, я использовал httpcfg.exe для привязки сертификата определенному порту. Если они предназначают что-то другое, чем это, примечание неоднозначно.

3
ответ дан pc1oad1etter 27 November 2019 в 00:56
поделиться

Я встретился с той же проблемой как Вы. К счастью, после поиска с помощью Google твердых шагов на эта страница делают SSL, работающий с моим HttpListener.

2
ответ дан Rahul Patel 27 November 2019 в 00:56
поделиться

У меня есть подобная проблема, и кажется, что могла быть проблема с самим сертификатом.

Вот путь, который работал на меня:

makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine

затем ищите след большого пальца сертификата, скопируйте его в буфер обмена и удалите пробелы. Это будет параметром после-h в следующей команде:

HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755

затем выполните сервисный хост на https://localhost:801/, и он работает отлично.

то, что я не могу сделать работой, - чтобы https работал на самосгенерированном сертификате. Вот код, который я выполняю для генерации одного (обработка ошибок, вынутая для ясности):

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 будет тайм-аут, как будто след большого пальца никогда не регистрировался. Если кто-либо знает, почему - прокомментируйте

EDIT1: После некоторого проигрывания вокруг, я нашел инициализацию для CertCreateSelfSignCertificate, который генерирует надлежащий сертификат:

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;
10
ответ дан Markus Safar 27 November 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: