In meinem letzten Beitrag habe ich berichtet, wie sich ein React-Frontend ins Go-Backend einbinden und gemeinsam ausliefern lässt. Dort war die Bereitstellung noch nicht SSL-verschlüsselt. Das übernahm bisher ein vorgelagerter NGINX als Reverse Proxy. Dort habe ich ja versprochen, die Verbindung im Backend schon zu verschlüsseln. Also los..
Die Zertifikate
Ich betreibe meine Anwendung auf einem kleinen VPS, keine Cloud, nichts besonderes. Um also die Verbindung absichern zu können, benutze ich LetsEncrypt und den certbot. Dabei halte ich mich strikt an die Anweisungen von deren Website: https://certbot.eff.org/
Mounten der Zertifikate
Sind die Zertifikate erstmal installiert, werden sie einfach in den Container gemountet. Ich benutze docker-compose für die Orchestrierung meiner Container. Die entsprechende Config sieht so aus:
version: "3"
services:
backend:
image: image:latest
container_name: name
volumes:
- /etc/letsencrypt/live/DOMAIN/fullchain.pem:/etc/letsencrypt/live/DOMAIN/fullchain.pem
- /etc/letsencrypt/live/DOMAIN/privkey.pem:/etc/letsencrypt/live/DOMAIN/privkey.pem
ports:
- 443:8000
Cert und Key liegen per default in /etc/letsencrypt/live/DOMAIN, wobei DOMAIN natürlich eure Domain darstellt — klar! ` Ich mounte sie der Einfachheit halber an die selbe Stelle im Container.
Nutzen der Zertifikate
Haben wir erstmal alles im Container, müssen wir nur noch dem HTTP-Server beibringen, wo er die Zertifkate für die Absicherung der Verbindung findet. Ich erzeuge mir also einen http.Server und konfiguriere ihn initial. Wenn ich ihn dann allerdings starte, benutze ich nicht wie bisher die Methode ListenAndServe(), sondern ListenAndServeTls(). Easy peasy!
httpServer := http.Server{
Addr: ":8000",
Handler: router,
}
// der alte Weg:
httpServer.ListenAndServe()
//Und jetzt mit Zertifikaten im Bauch:
cert := "/etc/letsencrypt/live/DOMAIN/fullchain.pem"
key := "/etc/letsencrypt/live/DOMAIN/privkey.pem"
httpServer.ListenAndServeTLS(cert, key)
Und schon ist die Verbindung sicher.
Ich mache übrigens beides, je nach Stage: über eine Umgebungsvariable gesteuert starte ich lokal ohne TLS, in der Produktion allerdings mit. Auch das lässt sich einfach über docker-compose steuern.
So far!