2009-11-09 2 views
6

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

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

ответ

4

Я считаю, что способ создания резервирования пространства имен HTTP.SYS осуществляется через неуправляемый API HttpSetServiceConfiguration(); поэтому для этого вам понадобится P/Invoke. Есть пример кода, который может быть полезен в столбцах MSDN one of Keith Brown.

+0

Я голосую за это, потому что Томас был первым, и мы в основном говорили то же самое. :) –

+0

Ссылка на статью Кена Брауна теперь мертва. Можете получить его здесь - http://web.archive.org/web/20121214083056/http://msdn.microsoft.com/en-us/magazine/cc163531.aspx – tjmoore

1

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

2

MSDN documentation, Keith Brown's MSDN column и pinvoke.net доставили мне большую часть пути. Но правильное выполнение PSOCKADDR в HTTP_SERVICE_CONFIG_SSL_KEY было сложным. Я нашел Beej's Guide to Network Programming очень полезно при определении того, что он должен выглядеть. Я смог использовать .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]; 
} 
Смежные вопросы