HttpListener prend en charge SSL uniquement pour localhost ?

la programmation


Bonjour,

Je pense que beaucoup de gens connaissent et utilisent HttpListener[^] classe.

D’après ce que je peux voir dans la note sur MSDN, il prend en charge le trafic 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.

J’ai ajouté un certificat racine au stockage local de confiance et un certificat supplémentaire au personnel également dans le stockage local signé par le certificat racine :

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"

J’ai lié le certificat au port comme ceci :

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

Et tout fonctionne mais uniquement pour les sites sur localhost. Lorsque j’essaie d’ouvrir par exemple https://codeproject.com. HttpListener “n’entend pas” la requête. Le navigateur tente d’ouvrir la page Web et échoue avec un délai d’attente.

BTW, je sais que cela s’appelle une attaque de l’homme du milieu, mais c’est uniquement à des fins de test et malheureusement je ne peux pas utiliser Fiddler qui utilise également cette technique.

Par tradition, ma question n’est pas simple, je crois qu’il n’y a pas de “évaluation gratuite”, désolé 🙂 mais si vous pouviez m’aider, ce serait génial.

Encore une remarque – j’ai lu presque tous les articles à ce sujet et tous les exemples de localhost. Donc, si vous souhaitez me fournir le lien vers un article, veuillez vérifier qu’il s’agit peut-être également de cet exemple pour localhost 😉

Et encore un – Peut-être que votre suggestion utilisera TcpListner ou quelque chose comme ça. Pour l’instant, je ne veux pas changer de logique, je changerai de logique si c’est seulement une solution.

Merci beaucoup. Timur.

Solution 1

Incroyable! plus de 50 vues et aucune réponse, comme d’habitude 🙂 Je réponds par moi-même, comme d’habitude.

HttpListener est une classe de plus haut niveau que TCPListener. Bien sûr, cela signifie qu’il est plus facile de travailler avec HttpListener mais ! cela signifie également qu’il y a un manque de fonctionnalités. Je veux dire que vous ne pouvez pas créer de proxy sérieux avec HTTPListener.

Comme nous savons que pour travailler avec un socket sécurisé (SSL), nous devons établir une liaison SSL (méthode CONNECT, etc.). Mais pour HttpListener, cela doit être fait via la liaison de certificat (netsh http add sslcert). Tout ce que je peux dire, c’est que j’ai tout essayé et que je n’aurais pas pu fonctionner avec un hôte distant, uniquement pour un hôte local. Je ne connais pas la raison, désolé.
Ensuite, ce certificat biding n’est pas confortable à utiliser en termes de proxy. Que faire si je souhaite créer des certificats à la volée avec le bon sujet CN ?

Tout cela m’a amené à réécrire mon application pour utiliser TCPListener et gérer les méthodes CONNECT.

L’article suivant m’aide à comprendre les bases :
Implémentation d’un serveur proxy de débogage HTTP/HTTPS multithread en C#[^]

Solution 6

Jamais trop tard pour une réponse ?

Les réservations d’URL sont requises lorsque vous tentez d’utiliser HttpListener pour autre chose que localhost. La syntaxe pour cela est la suivante :

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

: est le point de terminaison de votre HttpListener et est l’ID utilisateur ou le nom du groupe d’utilisateurs sous lequel la réservation d’URL sera enregistrée.

Supprimez la réservation avec la syntaxe suivante :

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

コメント

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