Instalación de certificados SSL con Let's Encrypt y Nginx en Debian

Creación de certificados SSL con Let's Encrypt y configuración en servidores Nginx para crear conexiones seguras entre el cliente y el servidor.

Requerimientos

  • Sistema Operativo Debian versión 9 (Stretch)
  • Tener instalado Nginx
  • Tener un dominio apuntando a la IP del Servidor.

1. Instalación de Certbot

Abre el archivo sources.list con el siguiente comando:

sudo nano /etc/apt/sources.list

y adiciona las siguientes líneas al final del archivo.

deb http://deb.debian.org/debian stretch-backports main contrib non-free
deb-src http://deb.debian.org/debian stretch-backports main contrib non-free

Ejemplo:

sources.list

deb http://cdn-aws.deb.debian.org/debian stretch main
deb http://security.debian.org/debian-security stretch/updates main
deb http://cdn-aws.deb.debian.org/debian stretch-updates main

deb http://deb.debian.org/debian stretch-backports main contrib non-free
deb-src http://deb.debian.org/debian stretch-backports main contrib non-free

Actualiza las dependencias del equipo

sudo apt update

Instala la última versión estable.

sudo apt install python-certbot-nginx -t stretch-backports

Muestra la versión instalada

certbot --version
certbot 0.28.0

2. Creación de un nuevo dominio

Para esta parte revisa la sección Creación y configuración de un nuevo dominio con Nginx.

Una vez que se tenga configurado un nuevo dominio, por ejemplo: http://your_domain.com podemos continuar con la configuración.

3. Creación del certificado SSL

Puede ver los certificados instalados con el siguiente comando:

sudo ls -l /etc/letsencrypt/live

Crea un nuevo certificado.

sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Elige la opción 2 para que las redirecciones se configuren de manera automática, luego presiona Enter.

Reinicia el servicio de nginx.

sudo service nginx restart

Verifica los cambios ingresando al sitio https://your_domain.com desde el navegador o ejecuta el siguiente comando en la terminal.

curl https://your_domain.com
<html>
  <head>
    <title>Welcome to your_domain.com!</title>
  </head>
  <body>
    <h1>Success!  The your_domain.com server block is working!</h1>
  </body>
</html>

4. Adiciona un dominio a un certificado existente

Adiciona el subdominio blog.your_domain.com a un certificado existente.

sudo certbot -d blog.your_domain.com --expand

Reinicia el servicio de nginx.

sudo service nginx restart

5. Elimina un dominio de un certificado

Elimina el dominio blog.your_domain.com de un certificado existente.

sudo certbot delete --cert-name blog.your_domain.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Deleted all files relating to certificate blog.your_domain.com.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Reconfigura manualmente las redirecciones en los ficheros de configuracióñ de nginx.

sudo nano /etc/nginx/sites-available/blog.your_domain.com

Por ejemplo, podrías comentar o eliminar las líneas # managed by Certbot que han sido agregadas por certbot. Se recomienda volver a crear el fichero con la configuración http por defecto.

blog.your_domain.com

server {
    root /var/www/blog.your_domain.com/html;
    index index.html index.htm index.nginx-debian.html;
    server_name blog.your_domain.com www.blog.your_domain.com;
    location / {
        try_files $uri $uri/ =404;
    }
    #listen [::]:443 ssl; # managed by Certbot
    #listen 443 ssl; # managed by Certbot
    #ssl_certificate /etc/letsencrypt/live/blog.your_domain.com/fullchain.pem; # managed by Certbot
    #ssl_certificate_key /etc/letsencrypt/live/blog.your_domain.com/privkey.pem; # managed by Certbot
    #include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    #ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
    #if ($host = blog.your_domain.com) {
    #    return 301 https://$host$request_uri;
    #} # managed by Certbot
    listen 80;
    listen [::]:80;
    server_name blog.your_domain.com www.blog.your_domain.com;
    #return 404; # managed by Certbot
}

Reinicia el servicio de nginx.

sudo service nginx restart

6. Configura la renovación automática

Los certificados emitidos por Let's Encrypt tienen una validez de 3 meses, por lo que habrá que renovarlos constantemente.

Comando para renovar los certificados:

sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your_domain.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/your_domain.com/fullchain.pem expires on 2020-09-04 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Prueba la renovación de certificados.

sudo certbot renew --dry-run
...
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/yourdomain.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Activa la renovación automática.

sudo certbot renew --quiet --no-self-upgrade

Referencias

Publicado: 6 de junio de 2020