2016-05-19 30 views
18

Ho il mio dominio con servizi Web scritto in Go. Sto usando il web server integrato, senza Nginx o Apache in primo piano.Come configurare l'applicazione server Let's Encrypt for a Go

Vorrei iniziare a servire su HTTPS e ho capito che Let's Encrypt sta per diventare THE WAY per farlo.

Qualcuno può condividere l'intera procedura di configurazione per configurare un'app Go in esecuzione su un server Linux?

+3

Utilizzare https://caddyserver.com/ - che fa questo per voi (rilascia un certificato e proxy alla vostra applicazione). – elithrar

+2

Qual è la domanda: come creare un certificato per un server web Go? Come configurare il server web Go per utilizzare il certificato/chiave privata? Altro ? –

+0

Il pacchetto 'crypto/tls' di Go è in grado di caricare certificati (chiavi pubbliche e private) da file in formato PEM. Uno strumento fornito da Let's Encrypt (ora sembra essere piuttosto promosso da EFF) è in grado di fornirti quel file in formato PEM. Quindi: 1) leggere una guida su come ottenere il certificato da Let's Encrypt e farlo; 2) Una volta ottenuto questo certificato, leggi come fare in modo che 'crypto/tls' lo legga e lo implementa nei tuoi server; 3) Chiedi ai tuoi server di leggere il tuo certificato. Hai finito. – kostix

risposta

42

Questa è l'impostazione automatica minima di un server HTTPS utilizzando Go e certificati Crittografa andiamo ho trovato:

package main 

import (
    "crypto/tls" 
    "log" 
    "net/http" 

    "golang.org/x/crypto/acme/autocert" 
) 

func main() { 
    certManager := autocert.Manager{ 
     Prompt:  autocert.AcceptTOS, 
     HostPolicy: autocert.HostWhitelist("example.com"), //Your domain here 
     Cache:  autocert.DirCache("certs"),     //Folder for storing certificates 
    } 

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     w.Write([]byte("Hello world")) 
    }) 

    server := &http.Server{ 
     Addr: ":https", 
     TLSConfig: &tls.Config{ 
      GetCertificate: certManager.GetCertificate, 
     }, 
    } 

    go http.ListenAndServe(":http", certManager.HTTPHandler(nil)) 

    log.Fatal(server.ListenAndServeTLS("", "")) //Key and cert are coming from Let's Encrypt 
} 

Maggiori informazioni sul pacchetto di autocert: link

MODIFICA: Necessario per rendere disponibile http a causa di letsencrypt security issue, leggere più here. Come bonus di questa correzione, ora abbiamo il reindirizzamento http -> https. Il vecchio esempio continuerà a funzionare se hai già ricevuto dei certificati, ma si romperà per i nuovi siti.

+0

Grazie, è l'esempio che stavo cercando! Ma bisogna stare attenti secondo la documentazione: * Questo pacchetto è un work in progress e non promette stabilità API. * – oliverpool

+0

Grazie mille! Questo dovrebbe essere selezionato come risposta corretta. – Chris

+0

Questo non include la cartella .well-known, vero? Quindi questo snippet include solo l'utilizzo dei certificati, non il rinnovo? –

20

Ho trovato una soluzione molto semplice, utilizzando la modalità autonoma.


installare il client CERTBOT (consigliato da Encrypt Let)

(go to the directory where you want to install the certbot client) 
git clone https://github.com/certbot/certbot 
cd certbot 
./certbot-auto --help` 


rilascio del diploma (PRIMA VOLTA)

N.B. questa operazione avviene attraverso la porta 80, quindi in caso la Go app ascolto sulla porta 80, deve essere spento prima di eseguire questo comando (che è molto rapido da eseguire, tra l'altro)

./certbot-auto certonly --standalone-supported-challenges http-01 -d www.yourdomain.com

ADD ASCOLTATORE SSL nel codice GO

http.ListenAndServeTLS(":443", "/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem", "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem", nil)

Fatto!


di rinnovare CERTIFICATO (certificati scadono dopo 90 giorni)

N.B.Puoi eseguirlo manualmente (riceverai un'email diversi giorni prima della scadenza del certificato) o impostare un crontab

se l'app Go non ascolta più la porta 80, l'app Go può continuare a funzionare mentre eseguire questo comando:
./certbot-auto renew --standalone

se il GO app ascolta ancora la porta 80, è possibile specificare i comandi per arrestare e riavviare l'applicazione Go:
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"

per la docum completa sentazione della Certbot comandi: https://certbot.eff.org/docs/using.html

+0

Anche questo funziona, ma ho usato il metodo di sfida 'dns' in cui aggiungi un record TXT al tuo DNS. –