Httplistener con supporto https

Sembra essere un sacco di informazioni confuse, a volte in conflitto, per quanto riguarda la capacità di un HTTPListener HTTPListener capace. La mia comprensione è la seguente:

La mia comprensione sopra è corretta? Altrimenti, per favore, educami.

Per quanto riguarda i certificati x509, la mia comprensione è:

  • Utilizzare makecert per creare un certificato x509. Questo certificato viene archiviato nell’archivio personale e deve essere spostato nell’archivio attendibile (dove verrà visualizzato il listener http). Sembra che posso usare certMgr per eseguire la mossa, oppure posso usare mmc per effettuare la mossa. Sembra che ci sia più di un formato di cert x509 ( DER , Base64 , pks , pswd protected pks private etc) .. Esiste un formato preferito che dovrei usare?

Una volta ottenuto il cert nell’archivio fidato, ho bisogno di collegarlo alla porta TCP. Sono su Win7: dovrei usare httpcfg o netsh ?

Qualsiasi consiglio / consiglio sarebbe apprezzato.

Ho fatto un sacco di compiti e ho funzionato. I passaggi per aggiungere il supporto SSL per un HttpListener .NET sono:

  1. Aggiorna il codice dell’app C # per includere il prefisso https. Esempio

     String[] prefixes = { "http://*:8089/","https://*:8443/" }; 

    Ecco dall’aspetto del codice.

  2. Per il lato certificato delle cose, usando la console di comando di Win SDK (puoi anche usare la console di comando di VS Professional)

    • Utilizzare makecert.exe per creare un’autorità di certificazione. Esempio:

       makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer 
    • Utilizzare makecert.exe per creare un certificato SSL

      makecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n "CN=vMargeSignedByCA" -ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My

    • Utilizzare la GUI MMC per installare CA nell’archivio Autorità attendibili

    • Utilizzare la GUI MMC per installare ssl cert nell’archivio personale
    • Collega il certificato a ip: port e application. Esempio:

      netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}

      Il certhash è l’identificazione personale dal tuo certificato SSL. lo puoi trovare usando mmc L’appid si trova in VS … di solito in assembly.cs, cerca il valore guida

Ci possono essere altri modi per realizzare quanto sopra, ma questo ha funzionato per me.

Ecco i passaggi, in dettaglio, che ho seguito per configurare un server standalone su Windows, utilizzando openssl per creare il certificato autofirmato per un’app HTTPListener C# . Include molti link, nel caso tu voglia fare ulteriori ricerche.

  1. Crea un server standalone in .NET tramite 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. Crea certificato autofirmato: *

    1. openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 , che richiederà il valore di ciascuno dei campi del certificato nella riga di comando. Per il nome comune, digitare il nome del dominio (ad es. localhost )
    2. openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx , in modo che possa essere importato con la sua chiave sul computer di destinazione.

    * Per un’alternativa usando makecert , vedere la risposta di Walter.

  3. Aprire Gestione certificati per il computer locale. Quando si esegue certmgr.msc , si apre Gestione certificati per l’ utente corrente , che non è ciò che vogliamo qui. Anziché:

    1. Da un prompt dei comandi amministrativo sul computer di destinazione, eseguire mmc
    2. Premere Ctrl + M o fare clic su File > Aggiungi / Rimuovi snap-in
    3. Scegli Certificates e clicca Aggiungi>
    4. Nella finestra di dialogo che viene visualizzata, scegli Computer Account e fai clic su Avanti
    5. Scegli il Local Computer . Fai clic su Fine , quindi su OK
  4. Importa il certificato ( pfx ) nell’archivio certificati di Windows sul computer di destinazione

    1. Nella finestra mmc precedentemente aperta, eseguire il drill down su Certificati (computer locale) > Personale
    2. Fare clic con il tasto destro su Personal , quindi fare clic su Tutte le attività -> Importa ...
    3. Nella seconda schermata della finestra di dialogo che appare, trova e importa il tuo certificato. Dovrai cambiare il filtro del tipo di All Files in Personal Information Exchange o All Files per trovarlo
    4. Nella schermata successiva, inserisci la password che hai scelto nel passaggio 2.1 e presta molta attenzione alla prima casella di controllo. Ciò determina la sicurezza con cui il certificato è archiviato e anche quanto è comodo da usare
    5. Nell’ultima schermata, scegli Place all certificates in the following store . Verificare che sia Personal , quindi fare clic su Fine
    6. Ripetere la procedura di importazione precedente per la sezione Trusted Root Certification Authorities certificazione Trusted Root Certification Authorities .
  5. Creare le associazioni port per la propria applicazione. Su Windows Vista e successivi, usa netsh , come ho fatto io. (Per Windows XP e versioni precedenti, utilizzare httpcfg )

    • Dalla riga di comando amministrativa, digitare quanto segue per configurare il binding SSL * per la propria app e la porta appropriata. NB: questo comando è facile da sbagliare , perché (in PowerShell) le parentesi devono essere sottoposte a escape . Il seguente comando di PowerShell funzionerà:

       netsh http add sslcert ipport=0.0.0.0:8443 ` certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 ` appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`} 

      Per cmd.exe , dovrebbe invece essere usato quanto segue:

       netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} 
      • Il parametro ipport farà sì che il ssl cert si leghi alla porta 8443 su ogni interfaccia di rete; per eseguire il binding a un’interfaccia specifica (solo), selezionare l’indirizzo IP associato a tale interfaccia di rete.
      • Il certhash è semplicemente l’impronta certhash del certificato, con gli spazi rimossi
      • L’ appid è il GUID memorizzato nell’assembly Info della tua applicazione. (Sidenote: il meccanismo netsh è evidentemente un’interfaccia COM, a giudicare da questa domanda e dalle sue risposte)

      * Microsoft ha reindirizzato il link SSL Binding da qui a lì .

  6. Avvia il tuo server web, e sei a posto!

Come fare i tuoi certificati autofirmati nelle risposte non ha funzionato per me e siccome la domanda richiede specificamente di rendere un HTTPListener HTTPListener capace e richiede suggerimenti / consigli, voglio condividere il mio approccio. Hai bisogno di un nome host, qualcosa come http://www.made-up.com che deve puntare al tuo IP WAN (es. chiedere al tuo host provider per istruzioni) e inoltrare la sua porta, ad esempio 443 alla tua macchina locale. Non dimenticarti di aprire quella porta 443 in entrata nel tuo firewall la tua macchina locale.

Ho usato https://letsencrypt.org/ . Su Windows non è così facile come su Linux perché non esiste un client ACME certbot ufficiale per Windows. Tuttavia è ansible utilizzare https://github.com/Lone-Coder/letsencrypt-win-simple , di cui esistono anche i binari. Tuttavia “Attualmente è supportato solo IIS”. Ma puoi facilmente ingannarlo per creare un certificato sul tuo computer in modo da poter accedere al tuo httplistener in modo SSL:

  1. Installa IIS (tramite le funzionalità di Windows su / di), crea un sito Web in IIS e assegna il nome host. Crea anche un sito Web sicuro (443 porte).
  2. Esegui letsencrypt-win-simple exe (ho usato la versione 1.9.1). Rispondi alle domande per fargli generare il certificato.
  3. Successivamente è ansible arrestare il server IIS.

Credo che sia necessario prendere nota dell’attività di aggiornamento generata, poiché non sono sicuro che riuscirà dopo alcuni mesi (probabilmente sarà necessario riavviare IIS per il rinnovo del certificato).