A la hora de instalar/renovar let’s encrypt en un servidor web con nginx tenemos que decidir si lo hacemos con un servidor temporal, lo que implica que debemos parar el servicio web temporalmente, o indicando cual es el DocumentRoot del servidor web para el dominio.

Esto último implica que la web o servicio tenga un DocumentRoot “público”, y eso no es siempre sencillo cuando estamos utilizando, por ejemplo una aplicación en Python, Java, Go y el nginx como proxy.

Para poder crear o renovar el certificado sin parar el servicio podemos crear un “alias” en el nginx para el dominio que apunte a una carpeta temporal.

Si creamos la carpeta /tmp/letsencrypt-auto

En la configuración del dominio en el nginx añadiremos dentro del server { } :

[...]

  location /.well-known/acme-challenge {
    default_type "text/plain";
    root        /tmp/letsencrypt-auto;
  }

[...]  

Con un reload del nginx (sin parada de servicio) ya tendremos esto configurado.

Con esto cualquier petición al dominio/.well-known/acme-challenge será respondida por el contenido de nuestra carpeta /tmp/letsencrypt-auto

Así lo generaremos con

certbot certonly --webroot -w /tmp/letsencrypt-auto -d mydomain.com

A partir de este momento podremos automatizar la renovación del certificado poniendo en el crontab un

certbot renew

NOTA: Es importante tambien poner en el crontab una tarea para que recargue (reload) el nginx, porque de otra forma, aunque tengamos el certificado renovado, el nginx no estará utilizando el certificado actualizado sino el anterior.