2016-05-19 6 views
18

Ich habe meine eigene Domain mit in Go geschriebenen Web-Services. Ich benutze den eingebauten Go Webserver, ohne Nginx oder Apache davor.So richten Sie Let's Encrypt für eine Go-Server-Anwendung ein

Ich möchte beginnen, über HTTPS zu dienen, und ich erkannte, Let's Encrypt ist gerade dabei, THE WAY dafür zu werden.

Kann jemand das gesamte Setup-Verfahren für die Konfiguration einer Go-App auf einem Linux-Server teilen?

+3

Verwenden Sie https://caddyserver.com/ - was das für Sie tut (gibt ein Zertifikat und Proxies an Ihre Anwendung aus). – elithrar

+2

Was ist die Frage: Wie erstellt man ein Zertifikat für einen Go-Webserver? Wie konfiguriere ich den Go-Webserver für die Verwendung des Zertifikats/privaten Schlüssels? Andere ? –

+0

Gos eigenes 'crypto/tls'-Paket kann Zertifikate (öffentliche und private Schlüssel) aus PEM-formatierten Dateien laden. Ein Tool, das von Let's Encrypt zur Verfügung gestellt wird (jetzt scheint es eher von EFF gefördert zu werden), ist in der Lage, Ihnen diese PEM-formatierte Datei zu liefern. Also: 1) Lesen Sie eine Anleitung zum Erhalten des Zertifikats von Let's Encrypt und tun Sie das; 2) Sobald Sie dieses Zertifikat haben, lesen Sie, wie man 'crypto/tls' liest und es in Ihren Servern implementiert; 3) Lassen Sie Ihre Server Ihr Zertifikat lesen. Sie sind fertig. – kostix

Antwort

42

Dies ist die minimale automatische Einrichtung von einem HTTPS-Server mit Go und Encrypt-Zertifikate Lassen Sie sich die ich gefunden habe:

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 
} 

Mehr Informationen über das autocert Paket: link

BEARBEITEN: Benötigt um HTTP verfügbar zu machen wegen letsencrypt security issue, lesen Sie mehr here. Als Bonus dieses Fixes haben wir jetzt http -> https redirect. Das alte Beispiel funktioniert weiterhin, wenn Sie bereits Zertifikate dafür erhalten haben, aber es wird für neue Websites nicht mehr funktionieren.

+0

Danke, es ist das Beispiel, nach dem ich gesucht habe! Aber man muss gemäß der Dokumentation vorsichtig sein: * Dieses Paket ist in Arbeit und macht keine API-Stabilitätsversprechen. * – oliverpool

+0

Vielen Dank! Dies sollte wirklich als die richtige Antwort ausgewählt werden. – Chris

+0

Dies schließt den .well-bekannten Ordner nicht ein, oder? Dieses Snippet enthält also nur die Verwendung der Zertifikate, nicht deren Erneuerung? –

20

Ich fand eine sehr einfache Lösung mit dem Standalone Modus.


DER CERTBOT Client installieren (empfohlen von Encrypt Lassen Sie uns)

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


AUSGABE ZERTIFIKAT (ERSTE MAL)

N. B. Dieser Vorgang geschieht durch den Port 80, also im Falle Ihrer Go App lauscht auf Port 80, muss es vor der Ausführung dieses Befehls abgeschaltet werden (was sehr schnell zu laufen, übrigens)

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

ADD SSL LISTENER IN YOUR GO CODE

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

Fertig!


TO RENEW ZERTIFIKAT (Zertifikate verfallen nach 90 Tagen)

N. B.Sie können dies entweder manuell ausführen (Sie erhalten eine E-Mail mehrere Tage vor Ablauf des Zertifikats) oder eine Crontab einrichten

Wenn Ihre Go-App nicht mehr auf Port 80 hört, kann Ihre Go-App weiter ausgeführt werden diesen Befehl ausführen:
./certbot-auto renew --standalone

wenn Ihr Go App hört noch auf Port 80, können Sie die Befehle angeben, die Go-App zu beenden und neu starten:
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"

für die komplette docum entation des Certbot Befehle: https://certbot.eff.org/docs/using.html

+0

Ich habe das funktioniert auch, aber verwendet die 'dns' Herausforderung Methode, wo Sie fügen Sie einen TXT-Datensatz zu Ihren DNS hinzu. –

Verwandte Themen