Привязка SSL-сертификата к порту программно - PullRequest
6 голосов
/ 09 ноября 2009

Я работаю над собственной службой WCF, для которой зашифрованная связь является опцией. Все работает нормально, когда сертификат уже привязан к порту, как описано здесь .

Однако я хочу не просить пользователя запустить инструмент командной строки. Есть ли способ связывания можно сделать программно? Возможно, используя WMI?

Ответы [ 4 ]

4 голосов
/ 09 ноября 2009

Я считаю, что способ создания резервирования пространства имен HTTP.SYS - через неуправляемый API HttpSetServiceConfiguration (); так что для этого вам понадобится P / Invoke. Вот пример кода, который может быть полезен в одном из столбцов MSDN Кейта Брауна.

3 голосов
/ 19 июня 2018

Я нашел эту библиотеку NuGet, которая может помочь программно связать сертификат SSL.

Вопрос довольно старый, но я думаю, что эта библиотека может быть полезна, как и мне, для тех, кто ищет чисто программный способ .Net для привязки SSL-сертификата к конечной точке IP.

Имя библиотеки (NuGet): SslCertBinding.Net

Источники: Исходники пакета GitHub NuGet

Описание библиотеки:

SslCertBinding.Net - это библиотека для .NET и Windows, предоставляющая простой API для добавления, удаления или получения привязок между портом https и сертификатом SSL.

Кредиты: Сегор

Эта библиотека построена на вызовах Win32API.

Чтобы узнать об использовании, взгляните на приведенную выше ссылку на источники пакетов GitHub NuGet, Раздел «Использование» .

2 голосов
/ 12 ноября 2009

Документация MSDN , столбец Кита Брауна MSDN и pinvoke.net помогли мне в этом. Но получить PSOCKADDR в HTTP_SERVICE_CONFIG_SSL_KEY правильно было сложно. Я нашел Руководство Биджа по сетевому программированию , очень полезное для выяснения того, как оно должно выглядеть . Я смог использовать .NET SocketAddress, а затем скопировать байты в массив, который можно маршалировать.

// serialize the endpoint to a SocketAddress and create an array to hold the values.  Pin the array.
SocketAddress socketAddress = ipEndPoint.Serialize();
byte[] socketBytes = new byte[socketAddress.Size];
GCHandle handleSocketAddress = GCHandle.Alloc(socketBytes, GCHandleType.Pinned);

// Should copy the first 16 bytes (the SocketAddress has a 32 byte buffer, the size will only be 16, which is what the SOCKADDR accepts
for (int i = 0; i < socketAddress.Size; ++i)
{
    socketBytes[i] = socketAddress[i];
}
1 голос
/ 09 ноября 2009

Да, но вы должны использовать HTTP API самостоятельно, которого в настоящее время нет .NET-оболочки, поэтому вы должны использовать P / Invoke. В частности, я думаю, что вы ищете HttpSetServiceConfiguration с идентификатором конфигурации HttpServiceConfigSSLCertInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...