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 utiliser certMgr pour effectuer le mouvement, ou je peux utiliser mmc 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.

51
demandé sur jpaugh 2012-07-10 01:19:38

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:

  1. 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.

  2. 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 SSL

      makecert -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.

72
répondu Walter Kelt 2013-09-26 12:58:08

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.

  1. créer un serveur autonome dans .NET via 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. créer un certificat auto-signé: *

    1. 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 exemple localhost )
    2. 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 .

  3. 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:

    1. à partir d'un message de commande administrative sur la machine cible, Lancez mmc
    2. de la Presse Ctrl + M , ou Cliquez sur Fichier > Ajouter/Supprimer un composant logiciel Enfichable
    3. choisir Certificates , et cliquer sur ajouter >
    4. dans le dialogue qui apparaît, choisissez Computer Account , et cliquez sur suivant
    5. choisir Local Computer . Cliquer finition , puis OK
  4. Importer le certificat ( pfx ) dans le Magasin de Certificats Windows sur la machine cible

    1. dans la fenêtre mmc précédemment ouverte, percer jusqu'à certificats (ordinateur Local) > "personnel
    2. faites un clic droit sur Personal , puis cliquez sur toutes les tâches - > Import...
    3. 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 ou All Files pour le trouver
    4. à 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
    5. Sur le dernier écran, choisissez Place all certificates in the following store . Vérifier qu'il est dit Personal , puis cliquez sur terminer
    6. répéter la procédure d'importation ci-dessus pour la section des certificats Trusted Root Certification Authorities .
  5. 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, utilisez httpcfg )

    • à 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 port 8443 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écanisme netsh est évidemment une interface COM, à en juger par cette" question et ses réponses)

      * Microsoft a redirigé le lien SSL Binding de ici à il .

  6. démarrez votre serveur web, et vous êtes prêt à y aller!

26
répondu jpaugh 2018-02-15 20:22:14

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:

  1. 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.
  2. 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.
  3. 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é).

1
répondu Stefan Verhagen 2016-12-27 20:46:16