2009-05-01 34 views
12

Estoy tratando de usar la clase HttpListener en una aplicación C# para que un mini servidor web sirva contenido a través de SSL. Para hacer esto, necesito usar la herramienta httpcfg. Tengo un archivo .pfx con mi par de claves públicas y privadas. Si importo este par de llaves manualmente usando mmc en la tienda de máquinas local, todo funciona bien. Sin embargo, si importo este par de claves mediante programación utilizando la clase X509Store, no puedo conectarme a mi mini servidor web. Tenga en cuenta que en ambos métodos, el certificado se importa a MY store en LocalMachine. Curiosamente, puedo ver el certificado en mmc una vez que lo importo programáticamente y cuando lo veo, la IU indica que también hay una clave privada disponible para este certificado.Importar certificado con clave privada mediante programación

Cavando un poco más profundo, observo que cuando importo manualmente el par de claves, puedo ver un nuevo archivo aparecer en C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys, pero no aparece cuando lo importo mediante programación. En una nota relacionada, cuando elimino un certificado importado manualmente, no elimina el archivo de clave privada correspondiente del directorio mencionado anteriormente.

En última instancia, mi pregunta es esta: cuando programáticamente agrego el certificado a la tienda, ¿dónde se almacena la clave privada y por qué no está accesible para la clase HttpListener (HttpApi)?

cuenta que esta pregunta está ligeramente relacionado, pero no creo que para conceder permiso es el problema, ya que esto es todo lo que se haga con el mismo usuario de Windows: How to set read permission on the private key file of X.509 certificate from .NET

Respuesta

28

Ok, lo descubrí. Tenía que ver con los parámetros clave de almacenamiento para el objeto de certificado. Para cualquier otra persona que se encuentre con este problema, asegúrese de construir sus objetos X509Certificate2 que está agregando a la tienda usando los indicadores X509KeyStorageFlags.PersistKeySet y X509KeyStorageFlags.MachineKeySet. Esto obligará a la clave privada a persistir en la ubicación del conjunto de teclas de la máquina que se requiere en HttpApi (HttpListener lo ajusta).

+0

Marque esta como la respuesta – Developer

+0

Lamentablemente, tengo que esperar 48 horas antes de hacerlo, y en ese momento probablemente me olvide de hacerlo. :( – Jason

+6

Perdí unos 30 minutos tratando de entender por qué "X509KeyStorageFlags.MachineKeySet & X509KeyStorageFlags.PersistKeySet" no funcionaba. Por supuesto, debería ser "X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet". Bastante obvio, por si acaso alguien más intenta la misma estupidez que hice. –

0

¿Es esta una manera SSL 2? Si es así, ¿enviaste un archivo de solicitud de certificado SSL generado en tu máquina? Este archivo de solicitud de certificado se utilizará para crear el SSL y juntos formarán un par de claves privadas públicas.

¿Intentó también asignar el permiso de certificación para la cuenta de usuario que se está utilizando para ejecutar la aplicación web? Puede hacerlo utilizando la herramienta Microsoft WSE 3.0.

+0

Solo estoy usando un par de claves autogeneradas para probar en este momento, por lo que esta solicitud de certificado está involucrada. No he jugado con ningún permiso relacionado ya que todo esto se hace como el mismo usuario (importación de certificados y ejecución del servidor web). No hay IIS ni nada más involucrado. – Jason

+0

Eso debería haber sido "no hay solicitud de certificado". – Jason

0

No es exactamente la respuesta a su pregunta, pero aquí por referencia de otros que van por este camino:

Here es un enlace a una charla MS que da muestra de código C# para hacer lo httpcfg hace, eliminando así la necesidad para la herramienta en implementación.

+0

Gracias, eso es un buen enlace.Lo estudié brevemente, pero solo se explica cómo usar la estructura URLACL_SET y no la SSL_SET que se necesita para administrar la configuración SSL en mi escenario. Desafortunadamente, la estructura SSL_SET es un poco más compleja, por lo que simplemente resultó engorroso trabajar con ella y el ejecutable httpcfg fue más conveniente. – Jason

Cuestiones relacionadas