Httplistener avec le support de https
semble être beaucoup d'informations confuses, parfois contradictoires, en ce qui concerne la capacité d'un HttpListener https. Mon interprétation est la suivante:
-
un code c nécessite un préfixe
https
(ex.https://*:8443
) pour que l'auditeur comprenne qu'il doit répondre aux requêtes SSL à ce port. -
Le handshake SSL qui se passe sous les couvertures et est géré par
http.sys
(enfoui quelque part sur la machine Windows); le code C n'a pas à gérer explicitement la poignée de main ssl, car il arrive sous les couvertures. -
il faut avoir un "certificat de confiance x509" sur la machine
httpListener
, et d'une manière ou d'une autre ce certificat doit être relié au port 8443 (dans cet exemple)
est-ce que mon interprétation ci-dessus est correcte? Dans la négative, veuillez éduquer je.
en ce qui concerne les certificats x509, ma compréhension est:
- utilisez
makecert
pour créer un certificat x509. Ce certificat est stocké dans le magasin personnel et doit être transféré dans le magasin de confiance (c'est là que l'écouteur http va chercher). Il semble que je puisse utilisercertMgr
pour effectuer le mouvement, ou je peux utilisermmc
pour effectuer le mouvement. Il semble qu'il y ait plus de 1 x509 format cert (DER
,Base64
,pks
, pswd protégépks
privé etc).. Est-il un format préféré que je devrais utiliser?
une fois que j'ai le cert dans le magasin de confiance, je dois le lier au port tcp. Je suis sur Win7: devrais-je utiliser httpcfg
ou netsh
?
n'importe quels conseils/conseils seraient appréciés.
3 réponses
j'ai fait un tas de devoirs et a obtenu ce travail. Les étapes pour ajouter le support SSL pour un .net HttpListener sont:
-
mettre à Jour l'application en C# code pour inclure le préfixe https. Exemple
String[] prefixes = { "http://*:8089/","https://*:8443/" };
c'est tout du côté du code.
-
Pour le certificat côté des choses, à l'aide de Win SDK de la console de commande (pouvez également utiliser VS Professionnel de la console de commande)
-
utiliser
makecert.exe
pour créer une autorité de certification. Exemple:makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer
-
utiliser
makecert.exe
pour créer un certificat SSLmakecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n "CN=vMargeSignedByCA" -ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My
-
utiliser L'interface graphique MMC pour installer L'AC dans le magasin de L'Autorité de confiance
- utiliser MMC GUI pour installer ssl cert En magasin personnel
-
Lier certificat d'ip:port et de l'application. Exemple:
netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}
le certhash est l'empreinte du pouce de votre certificat ssl. vous pouvez trouver ceci en utilisant mmc L'appid se trouve dans VS...généralement en assemblage.cs, rechercher la valeur d'orientation
-
il y a peut-être d'autres façons d'accomplir ce qui précède, mais cela a fonctionné pour moi.
Voici les étapes, en détail, que j'ai suivies pour configurer un serveur autonome sur Windows, en utilisant openssl
pour créer le certificat auto-signé pour un C#
HTTPListener
app. Il comprend beaucoup de liens, au cas où vous voulez faire des recherches plus approfondies.
-
créer un serveur autonome dans
.NET
viaHttpListener
: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();
-
créer un certificat auto-signé: *
-
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
, qui vous demandera la valeur de chacun des champs du certificat sur la ligne de commande. Pour le nom commun, tapez le nom de domaine (par exemplelocalhost
) -
openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx
, pour qu'il puisse être importé avec sa clé sur la machine cible.
* pour une alternative en utilisant
makecert
, voir la réponse de Walter . -
-
Ouvrir le Gestionnaire de Certificats de l'ordinateur Local. Lorsque vous lancez
certmgr.msc
, il ouvre le Gestionnaire de certificats pour le utilisateur courant , ce qui n'est pas ce que nous voulons ici. À la place:- à partir d'un message de commande administrative sur la machine cible, Lancez
mmc
- de la Presse Ctrl + M , ou Cliquez sur Fichier > Ajouter/Supprimer un composant logiciel Enfichable
- choisir
Certificates
, et cliquer sur ajouter > - dans le dialogue qui apparaît, choisissez
Computer Account
, et cliquez sur suivant - choisir
Local Computer
. Cliquer finition , puis OK
- à partir d'un message de commande administrative sur la machine cible, Lancez
-
Importer le certificat (
pfx
) dans le Magasin de Certificats Windows sur la machine cible- dans la fenêtre
mmc
précédemment ouverte, percer jusqu'à certificats (ordinateur Local) > "personnel - faites un clic droit sur
Personal
, puis cliquez sur toutes les tâches - > Import... - dans le 2ème écran de la boîte de dialogue qui apparaît, trouvez et importez votre certificat. Vous devrez changer le filtre de type de fichier en
Personal Information Exchange
ouAll Files
pour le trouver - à l'écran suivant, Entrez le mot de passe que vous avez choisi à l'étape 2.1, et payez près attention à la première case. Cela détermine la façon dont votre certificat est stocké en toute sécurité, et aussi comment il est pratique d'utiliser
- Sur le dernier écran, choisissez
Place all certificates in the following store
. Vérifier qu'il est ditPersonal
, puis cliquez sur terminer - répéter la procédure d'importation ci-dessus pour la section des certificats
Trusted Root Certification Authorities
.
- dans la fenêtre
-
créer les associations portuaires pour votre application. Sur Windows Vista et plus tard, utilisez
netsh
, comme je l'ai fait. (Pour Windows XP et versions antérieures, utilisezhttpcfg
)-
à partir de la ligne de commande administrative, tapez ce qui suit pour configurer le SSL binding * à votre application, et le port approprié. NB: Cette commande est facile de se tromper , parce que (PowerShell), les accolades ont besoin d' être échappé . La commande PowerShell suivante fonctionnera:
netsh http add sslcert ipport=0.0.0.0:8443 ` certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 ` appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`}
pour
cmd.exe
, il convient d'utiliser à la place:netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
- le paramètre
ipport
obligera le certificat ssl à se lier au port8443
sur chaque interface réseau; pour se lier à une interface spécifique (seulement), choisissez l'adresse IP associée à cette interface réseau. - le
certhash
est simplement l'empreinte du pouce du certificat, avec des espaces supprimés - le
appid
est la référence stockée dans les informations D'assemblage de votre application. (Remarque: le mécanismenetsh
est évidemment une interface COM, à en juger par cette" question et ses réponses)
- le paramètre
-
-
démarrez votre serveur web, et vous êtes prêt à y aller!
comme faire vos propres certificats auto-signés dans les réponses n'a pas fonctionné pour moi et comme la question appelle spécifiquement à faire un .net HTTPListener https capable et demande des conseils/conseils, je veux partager mon approche.Vous avez besoin d'un nom d'hôte, quelque chose comme www.made-up.com qui doit pointer vers votre IP WAN (par exemple demander des instructions à votre hébergeur) et transmettre son port, par exemple 443 à votre machine locale.N'oubliez pas d'ouvrir ce port inbound 443 dans votre pare-feu local. machine.
j'ai utilisé https://letsencrypt.org / . Sous windows, ce n'est pas aussi simple que sous Linux car il n'y a pas de client officiel certbot ACME pour windows. Cependant, vous pouvez utiliser https://github.com/Lone-Coder/letsencrypt-win-simple , dont il y a aussi des binaires autour. Toutefois,"à l'heure actuelle, seul L'IIS est pris en charge". Mais vous pouvez facilement le tromper pour créer un certificat sur votre ordinateur de sorte que vous pouvez approcher votre httplistener SSL way:
- installez IIS (via les fonctionnalités de windows on/of), créez un site Web dans IIS et assignez le nom d'hôte. Aussi faire un site Web sécurisé (443 port) de celui-ci.
- lancer letsencrypt-win-simple exe (j'ai utilisé la version 1.9.1). Répondez aux questions pour qu'il génère le certificat.
- après cela, vous pouvez arrêter le serveur de IIS.
je crois que vous avez à prendre note de la tâche d'actualisation produit, car je ne suis pas sûr qu'il réussira après quelques mois (vous devrez probablement recommencer IIS pour que le certificat soit renouvelé).