.net - Httplistener con soporte https
x509certificate (3)
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:
El código c # de uno necesita un prefijo
https
(por ejemplo,https://*:8443
) para que el oyente comprenda que necesita atender las solicitudes SSL en este puerto.El verdadero apretón de manos SSL ocurre bajo las cubiertas y es manejado por
http.sys
(enterrado en algún lugar en la máquina de Windows); El código C # no tiene que administrar explícitamente el apretón de manos SSL, ya que ocurre bajo las cubiertas.Uno necesita tener un "certificado de confianza x509" en la máquina
httpListener
, y de alguna manera ese certificado debe estar vinculado al puerto 8443 (en este ejemplo)
¿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 usarcertMgr
para realizar el movimiento, o puedo usarmmc
para efectuar el movimiento. Parece que hay más de 1 x509 formato depks
(DER
,Base64
,pks
, pswd protegidospks
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.
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 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:
- 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).
- Ejecute el exe letsencrypt-win-simple (utilicé la versión 1.9.1). Responda las preguntas para dejar que genere el certificado.
- 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).
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.
Cree un servidor independiente en
.NET
través deHttpListener
: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();
Crear certificado autofirmado: *
-
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
) -
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 answer Walter.-
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:- Desde un símbolo del sistema administrativo en la máquina de destino, ejecute
mmc
- Presione Ctrl + M , o haga clic en Archivo > Agregar / Eliminar complemento
- Elija
Certificates
y haga clic en Agregar> - En el cuadro de diálogo que aparece, elige
Computer Account
y haz clic en Siguiente - Elija una
Local Computer
. Haga clic en Finalizar , luego en Aceptar
- Desde un símbolo del sistema administrativo en la máquina de destino, ejecute
Importe el certificado (
pfx
) al almacén de certificados de Windows en la máquina de destino- En la ventana
mmc
abierta previamente, navega hacia abajo a Certificados (computadora local) > Personal - Haga clic derecho en
Personal
, luego haga clic en Todas las tareas -> Importar ... - 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
oAll Files
para encontrarlo - En la pantalla siguiente, ingrese la contraseña que eligió en el paso 2.1 y preste mucha atención a la primera casilla de verificación. Esto determina qué tan seguro se almacena su certificado, y también qué tan conveniente es usarlo.
- En la última pantalla, elija
Place all certificates in the following store
. Verifique que dicePersonal
, luego haga clic en Finalizar - Repita el procedimiento de importación anterior para la sección de certificados de
Trusted Root Certification Authorities
certificaciónTrusted Root Certification Authorities
.
- En la ventana
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, usehttpcfg
)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 escaped . 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 elipport
ssl se enlace al puerto8443
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 mecanismonetsh
es evidentemente una interfaz COM, a juzgar por esta question y sus respuestas)
* Microsoft ha redirigido el enlace SSL Binding de here para there .
- El parámetro
¡Abre tu servidor web y listo!
Hice muchos deberes y conseguí que funcionara. Los pasos para agregar soporte SSL para .NET HttpListener son:
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.
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 SSLmakecert -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í.