2009-11-09 21 views
6

Estoy trabajando en un servicio WCF alojado automáticamente para el que las comunicaciones cifradas son una opción. Todo funciona bien cuando un certificado ya está vinculado al puerto como se describe en here.Enlace de un certificado SSL a un puerto mediante programación

Sin embargo, quiero evitar pedirle al usuario que ejecute una herramienta de línea de comandos. ¿Hay alguna manera de que el enlace se pueda realizar mediante programación? Tal vez usando WMI?

Respuesta

4

Creo que la manera de crear una reserva de espacio de nombres HTTP.SYS es mediante la API no administrada HttpSetServiceConfiguration(); entonces necesitarás un P/Invoke para eso. Hay algún código de muestra que podría ser útil en one of columnas MSDN de Keith Brown.

+0

Lo que estoy viendo es porque Tomas era el primero y básicamente dijimos lo mismo. :) –

+0

El enlace del artículo de Ken Brown ahora está muerto. Puede conseguirlo aquí, sin embargo - http://web.archive.org/web/20121214083056/http://msdn.microsoft.com/en-us/magazine/cc163531.aspx – tjmoore

1

Sí, pero usted tiene que usar the HTTP API usted mismo que actualmente no es .NET contenedor, por lo que debe utilizar P/Invoke. Específicamente, creo que está buscando HttpSetServiceConfiguration con la identificación de configuración HttpServiceConfigSSLCertInfo.

2

El MSDN documentation, de Keith Brown MSDN column y pinvoke.net me tiene la mayor parte del camino. Pero conseguir el PSOCKADDR en la HTTP_SERVICE_CONFIG_SSL_KEY correcta fue complicado. Encontré Beej's Guide to Network Programming muy útil para averiguar cómo se ve como. Pude usar .NET SocketAddress y luego copiar los bytes en una matriz que podría ser ordenada.

// 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]; 
} 
Cuestiones relacionadas