Pregunta

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ública y privada. Si importo este par de claves manualmente usando mmc en el almacén de la máquina 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 está importando a la tienda MY en LocalMachine. Curiosamente, puedo ver el certificado en mmc una vez que lo importé mediante programación y cuando lo veo, la interfaz de usuario indica que también hay una clave privada disponible para este certificado.

Examinando un poco más, me doy cuenta de que al importar manualmente el par de claves, puedo ver que aparece un nuevo archivo en C: \ Documents and Settings \ Todos los usuarios \ Datos de aplicación \ Microsoft \ Crypto \ RSA \ MachineKeys , pero uno no aparece cuando importo programáticamente. 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 la siguiente: cuando agrego mediante programación el certificado a la tienda, ¿dónde se almacena la clave privada y por qué no está accesible para la clase HttpListener (HttpApi)?

Tenga en cuenta que esta pregunta está un poco relacionada, pero no creo que el problema sea el permiso, ya que todo se hace como el mismo usuario de Windows: Cómo establecer el permiso de lectura en el archivo de clave privada del certificado X.509 de .NET

¿Fue útil?

Solución

Ok, lo descubrí. Tenía que ver con los parámetros de almacenamiento de claves para el objeto de certificado. Para cualquier otra persona que se encuentre con este problema, asegúrese de construir los objetos X509Certificate2 que está agregando a la tienda utilizando el X509KeyStorageFlags.PersistKeySet y X509KeyStorageFlags.MachineKeySet banderas. Esto obligará a que la clave privada persista en la ubicación del conjunto de claves de la máquina que es requerida por HttpApi ( HttpListener lo envuelve).

Otros consejos

¿Esto es un SSL de 2 vías? Si es así, ¿envió un archivo de solicitud de certificado SSL generado en su máquina? Este archivo de solicitud de certificado se utilizará para crear el SSL y juntos forman un par de claves privadas públicas.

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top