long lets last how expiration example encrypt clients certificates ssl go https ssl-certificate lets-encrypt

ssl - last - lets encrypt api



Cómo configurar la aplicación del servidor Let''s Encrypt for a Go (2)

Tengo mi propio dominio con servicios web escritos en Go. Estoy usando el servidor web incorporado Go, sin Nginx o Apache en el frente.

Me gustaría comenzar a servir a través de HTTPS y me di cuenta de que Let''s Encrypt está a punto de convertirse en EL CAMINO para hacerlo.

¿Alguien puede compartir todo el procedimiento de configuración para configurar una aplicación Go que se ejecuta en un servidor Linux?


Encontré una solución muy simple, usando el modo independiente .


INSTALAR EL CLIENTE CERTBOT (recomendado por Let''s Encrypt)

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


EDICIÓN DE CERTIFICADO (PRIMERA VEZ)

NB: esta operación se realiza a través del puerto 80, por lo que, en caso de que su aplicación Go escuche en el puerto 80, debe apagarse antes de ejecutar este comando (que es muy rápido de ejecutar, por cierto)

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

AGREGAR SSL LISTENER EN SU CÓDIGO GO

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

¡Hecho!


PARA RENOVAR EL CERTIFICADO (los certificados expiran después de 90 días)

NB Puede ejecutar esto manualmente (recibirá un correo electrónico varios días antes de que caduque el certificado) o configurar un crontab

Si su aplicación Go ya no escucha el puerto 80, su aplicación Go puede seguir ejecutándose mientras ejecuta este comando:
./certbot-auto renew --standalone

Si su aplicación Go aún escucha el puerto 80, puede especificar los comandos para detener y reiniciar la aplicación Go:
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"

para obtener la documentación completa de los comandos de Certbot: https://certbot.eff.org/docs/using.html


Esta es la configuración automática mínima de un servidor HTTPS que utiliza los certificados Go y Let''s Encrypt que he encontrado:

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 }

Más información sobre el paquete de autocert: link

EDITAR: se necesita para que http esté disponible debido al problema de seguridad de letsencrypt , lea más here . Como beneficio adicional de esta solución, ahora tenemos http -> https redirect. El ejemplo anterior continuará funcionando si ya ha recibido certificados en él, pero se interrumpirá para los nuevos sitios.