¿HttpListener admite SSL solo para localhost?

programación


Hola,

Creo que mucha gente conoce y usa HttpListener[^] clase.

Por lo que puedo ver en la nota en MSDN, admite tráfico https:

If you create an HttpListener using https, you must select a Server Certificate for that listener. Otherwise, an HttpWebRequest query of this HttpListener will fail with an unexpected close of the connection.

Agregué el certificado raíz al almacenamiento local de confianza y un certificado más personal también en el almacenamiento local que firmó con el certificado raíz:

ROOT
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=Root,O=DO_NOT_TRUST,OU=test purposes" -sky signature -pe -r "Root.cer" -sv "RootKey.pvk"

Personal
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=*.codeproject.com,O=DO_NOT_TRUST,OU=test purposes" -sky exchange -pe -ir localmachine  -iv "RootKey.pvk" -ic "Root.cer"

Vinculé el certificado al puerto de esta manera:

netsh http add sslcert ipport=0.0.0.0:8081 certhash="{hash}" appid={guid}

Y todo funciona, pero solo para sitios en localhost. Cuando intento abrir, por ejemplo, https://codeproject.com. HttpListener solicitud “no escucha”. El navegador intenta abrir la página web y falla el tiempo de espera.

Por cierto, sé que se llama ataque de intermediario, pero es solo para fines de prueba y desafortunadamente no puedo usar Fiddler, que también usa esta técnica.

Por tradición, mi pregunta no es simple, creo que aquí no hay “calificación gratuita”, lo siento 🙂 pero si pueden ayudarme, sería genial.

Una nota más: he leído casi todos los artículos sobre esto y todos los ejemplos de localhost allí. Entonces, si me va a proporcionar el enlace a un artículo, verifique que puede ser este ejemplo también para localhost;)

Y uno más: puede ser que su sugerencia utilice TcpListner o algo como esto. Por ahora no quiero cambiar la lógica, cambiaré la lógica si solo es una solución.

Muchas gracias. Timur.

Solución 1

¡Asombroso! más de 50 visitas y ninguna respuesta, como siempre 🙂 Respondiendo yo solo, como siempre.

HttpListener es una clase de más alto nivel que TCPListener. Por supuesto, esto significa que es más fácil trabajar con HttpListener, ¡pero! Esto también significa que hay falta de funcionalidad. Quiero decir que no puedes crear un proxy serio con HTTPListener.

Como sabemos, para trabajar con socket seguro (SSL), necesitamos realizar un protocolo de enlace SSL (método CONNECT, etc.). Pero para HttpListener debe hacerse mediante el enlace de certificado (netsh http add sslcert). Todo lo que puedo decir es que intenté todo y no podría haber funcionado para el host remoto, solo para el host local. No sé el motivo, lo siento.
Además, esta oferta de certificado no es cómoda de usar en términos de proxy. ¿Qué sucede si quiero crear certificados sobre la marcha con el asunto CN correcto?

Todo esto me hizo reescribir mi aplicación para usar TCPListener y manejar métodos CONNECT.

El siguiente artículo me ayuda a comprender los conceptos básicos:
Implementación de un servidor proxy de depuración HTTP/HTTPS multiproceso en C#[^]

Solución 6

¿Nunca es tarde para una respuesta?

Se requieren reservas de URL cuando se intenta utilizar HttpListener para cualquier cosa que no sea localhost. La sintaxis para esto es la siguiente:

netsh http add urlacl url=http://<hostName>:<port>/ user=<user>

donde : es el punto final de su HttpListener y es el ID de usuario o el nombre del grupo de usuarios bajo el cual se registrará la reserva de URL.

Elimina la reserva con la siguiente sintaxis:

netsh http delete urlacl url=http://<hostName>:<port>/

コメント

タイトルとURLをコピーしました