Httplistener con soporte https

Parece ser una gran cantidad de información confusa, a veces contradictoria, con respecto a hacer que un .NET HTTPListener https sea capaz. Mi entendimiento es el siguiente:

¿Está mi entendimiento por encima de correcto? Si no, por favor, enséñame.

En cuanto a los certificados x509, mi entendimiento es:

  • Use makecert para crear un certificado x509. Este certificado se almacena en la tienda personal y debe trasladarse al Almacén de confianza (aquí es donde se verá el oyente http). Parece que puedo usar certMgr para realizar el movimiento, o puedo usar mmc para efectuar el movimiento. Parece que hay más de 1 x509 formato de pks ( DER , Base64 , pks , pswd protegidos pks privados, etc.). ¿Hay algún formato preferido que deba usar?

Una vez que obtenga el certificado en la tienda confiable, necesito vincularlo al puerto tcp. Estoy en Win7: ¿debería estar usando httpcfg o netsh ?

Cualquier consejo / consejo sería apreciado.

Hice muchos deberes y conseguí que funcionara. Los pasos para agregar soporte SSL para .NET HttpListener son:

  1. Actualice el código de la aplicación C # para incluir el prefijo https. Ejemplo

     String[] prefixes = { "http://*:8089/","https://*:8443/" }; 

    Eso es todo desde el aspecto del código.

  2. Para el lado del certificado de cosas, usar la consola de comandos de Win SDK (también puede usar la consola de comandos de VS Professional)

    • Use makecert.exe para crear una autoridad de certificación. Ejemplo:

       makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer 
    • Use makecert.exe para crear un certificado SSL

      makecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n "CN=vMargeSignedByCA" -ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My

    • Utilice la GUI de MMC para instalar CA en la tienda de Trusted Authority.

    • Utilice la GUI de MMC para instalar el certificado SSL en la tienda personal
    • Enlace el certificado a ip: puerto y aplicación. Ejemplo:

      netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}

      El certhash es la huella digital de su certificado ssl. usted puede encontrar esto usando mmc El appid se encuentra en VS … generalmente en assembly.cs, busque el valor de guía

Puede haber otras formas de lograr lo anterior, pero esto funcionó para mí.

Estos son los pasos, en detalle, que seguí para configurar un servidor independiente en Windows, usando openssl para crear el certificado autofirmado para una aplicación C# HTTPListener . Incluye muchos enlaces, en caso de que desee realizar más investigaciones.

  1. Cree un servidor independiente en .NET través de HttpListener :

     var prefixes = {"http://localhost:8080/app/root", "https://localhost:8443/app/root"}; var listener = new HttpListener(); foreach (string s in prefixes) listener.Prefixes.Add(s); listener.Start(); 
  2. Crear certificado autofirmado: *

    1. openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 , que le solicitará el valor de cada uno de los campos del certificado en la línea de comando. Para el nombre común, escriba el nombre de dominio (por ejemplo, localhost )
    2. openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx , por lo que se puede importar con su clave en la máquina de destino.

    * Para una alternativa que usa makecert , vea la propia respuesta de Walter.

  3. Abra el Administrador de certificados para la máquina local. Cuando ejecuta certmgr.msc , abre el Administrador de certificados para el usuario actual , que no es lo que queremos aquí. En lugar:

    1. Desde un símbolo del sistema administrativo en la máquina de destino, ejecute mmc
    2. Presione Ctrl + M , o haga clic en Archivo > Agregar / Eliminar complemento
    3. Elija Certificates y haga clic en Agregar>
    4. En el cuadro de diálogo que aparece, elige Computer Account y haz clic en Siguiente
    5. Elija una Local Computer . Haga clic en Finalizar , luego en Aceptar
  4. Importe el certificado ( pfx ) al almacén de certificados de Windows en la máquina de destino

    1. En la ventana mmc abierta previamente, navega hacia abajo a Certificados (computadora local) > Personal
    2. Haga clic derecho en Personal , luego haga clic en Todas las tareas -> Importar ...
    3. En la segunda pantalla del diálogo que aparece, encuentre e importe su certificado. Deberá cambiar el filtro de tipo de archivo a Personal Information Exchange o All Files para encontrarlo
    4. En la pantalla siguiente, ingrese la contraseña que eligió en el paso 2.1 y preste mucha atención a la primera checkbox. Esto determina qué tan seguro se almacena su certificado, y también qué tan conveniente es usarlo.
    5. En la última pantalla, elija Place all certificates in the following store . Verifique que dice Personal , luego haga clic en Finalizar
    6. Repita el procedimiento de importación anterior para la sección de certificados de Trusted Root Certification Authorities certificación Trusted Root Certification Authorities .
  5. Crea las asociaciones de puertos para tu aplicación. En Windows Vista y posterior, use netsh , como lo hice. (Para Windows XP y versiones anteriores, use httpcfg )

    • Desde la línea de comando administrativa, escriba lo siguiente para configurar el enlace SSL * a su aplicación y el puerto apropiado. NB: Este comando es fácil de equivocarse , porque (en PowerShell) los frenos deben escaparse . El siguiente comando de PowerShell funcionará:

       netsh http add sslcert ipport=0.0.0.0:8443 ` certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 ` appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`} 

      Para cmd.exe , se debe utilizar lo siguiente:

       netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} 
      • El parámetro ipport hará que el ipport ssl se enlace al puerto 8443 en cada interfaz de red; para enlazar a una interfaz específica (solo), elija la dirección IP asociada con esa interfaz de red.
      • El certhash es simplemente la huella digital del certificado, con espacios eliminados
      • La appid es el GUID almacenado en la información de ensamblaje de su aplicación. (Nota: el mecanismo netsh es evidentemente una interfaz COM, a juzgar por esta pregunta y sus respuestas)

      * Microsoft ha redirigido el enlace SSL Binding de aquí para allá .

  6. ¡Abre tu servidor web y listo!

Como hacer sus propios certificados autofirmados en las respuestas no funcionó para mí y como la pregunta específicamente requiere la creación de un .NET HTTPListener https y le pide consejos / sugerencias, quiero compartir mi enfoque. Necesita un nombre de host, algo como http://www.made-up.com, que necesita apuntar a su WAN IP (por ejemplo, pregunte a su proveedor de host por las instrucciones) y reenviar su puerto, por ejemplo, 443 a su máquina local. No olvide abrir ese puerto de entrada 443 en su firewall de su máquina local.

Usé https://letsencrypt.org/ . En Windows, esto no es tan fácil como en Linux porque no hay un cliente certificado certbot ACME para Windows. Sin embargo, puede usar https://github.com/Lone-Coder/letsencrypt-win-simple , de los cuales también hay binarios. Sin embargo, “Actualmente solo se admite IIS”. Pero puede engañarlo fácilmente para crear un certificado en su computadora de modo que pueda acercarse a su httplistener de la manera SSL:

  1. Instale IIS (a través de las características de Windows en / de), cree un sitio web dentro de IIS y asigne el nombre de host. También cree un sitio web seguro (443 puertos).
  2. Ejecute el exe letsencrypt-win-simple (utilicé la versión 1.9.1). Responda las preguntas para dejar que genere el certificado.
  3. Después de eso, puede detener el servidor de IIS.

Creo que debe tomar nota de la tarea de actualización generada, ya que no estoy seguro de que tendrá éxito después de unos meses (es probable que deba volver a iniciar IIS para renovar el certificado).