Cómo proteger Nginx con Lets Encrypt en Ubuntu y Debian


Siguiendo el tutorial anterior de Let's Encrypt sobre Apache SSL, en este artículo discutiremos cómo generar e instalar un certificado SSL/TLS gratuito emitido por Let's Encrypt CA para el servidor web Nginx en Ubuntu o Debian.

  1. Proteja Apache con Free Let's Encrypt en Ubuntu y Debian
  2. Instale Let's Encrypt SSL para proteger Apache en RHEL y CentOS

  1. Un dominio registrado con registros DNS A válidos que apunten a la dirección IP de su servidor.
  2. Un servidor web Nginx instalado con SSL y Vhost habilitados, en caso de que planee alojar varios dominios o subdominios.

Paso 1: Instalación del servidor web Nginx

1. En el primer paso, instale el servidor web Nginx, si aún no está instalado, emitiendo el siguiente comando:

$ sudo apt-get install nginx

Paso 2: Genere un certificado SSL Let's Encrypt para Nginx

2. Antes de generar un certificado SSL/TLS gratuito, instale el software Let's Encrypt en la jerarquía del sistema de archivos /usr/local/ con la ayuda del cliente git emitiendo los siguientes comandos:

$ sudo apt-get -y install git
$ cd /usr/local/
$ sudo git clone https://github.com/letsencrypt/letsencrypt

3. Aunque el procedimiento para obtener un certificado para Nginx está automatizado, aún puede crear e instalar manualmente un certificado SSL gratuito para Nginx utilizando el complemento Let's Encrypt Standalone.

Este método requiere que el puerto 80 no esté en uso en su sistema por un período corto de tiempo mientras el cliente Let's Encrypt valida la identidad del servidor antes de generar el certificado.

En caso de que ya esté ejecutando Nginx, detenga el servicio emitiendo el siguiente comando.

$ sudo service nginx stop
OR
$ sudo systemctl stop nginx

En caso de que esté ejecutando otro servicio que se vincule en el puerto 80, detenga ese servicio también.

4. Confirme que el puerto 80 esté libre ejecutando el comando netstat:

$ sudo netstat -tlpn | grep 80

5. Ahora es el momento de ejecutar letsencrypt para obtener un certificado SSL. Vaya al directorio de instalación de Let's Encrypt que se encuentra en la ruta del sistema/usr/local/letsencrypt y ejecute el comando letsencrypt-auto proporcionando la opción certonly --standalone y el indicador -d para cada dominio o subdominio que desee generar un certificado.

$ cd /usr/local/letsencrypt
$ sudo ./letsencrypt-auto certonly --standalone -d your_domain.tld 

6. Ingrese la dirección de correo electrónico que utilizará Let's Encrypt para la recuperación de claves perdidas o avisos urgentes.

7. Acepte los términos de la licencia presionando la tecla Enter.

8. Finalmente, si todo salió bien, debería aparecer un mensaje similar a la captura de pantalla siguiente en la consola de su terminal.

Paso 3: Instale Let's Encrypt SSL Certificate en Nginx

9. Ahora que se ha generado su certificado SSL, es el momento de configurar el servidor web Nginx para usarlo. Los nuevos certificados SSL se colocan en /etc/letsencrypt/live/ en un directorio que lleva el nombre de su nombre de dominio. Ejecute el comando ls para enumerar los archivos de certificado emitidos para su dominio.

$ sudo ls /etc/letsencrypt/live/
$ sudo ls -al /etc/letsencrypt/live/caeszar.tk

10. A continuación, abra el archivo /etc/nginx/sites-available/default con un editor de texto y agregue el siguiente bloque después de la primera línea comentada que especifica el comienzo del bloque SSL. Utilice la siguiente captura de pantalla como guía.

$ sudo nano /etc/nginx/sites-enabled/default

Extracto del bloque Nginx:

# SSL configuration
        #
        listen 443 ssl default_server;
        ssl_certificate /etc/letsencrypt/live/caeszar.tk/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/caeszar.tk/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        ssl_dhparam /etc/nginx/ssl/dhparams.pem;

Reemplace los valores del nombre de dominio para los certificados SSL en consecuencia.

11. En el siguiente paso, genere un cifrado Diffie-Hellman fuerte en el directorio/etc/nginx/ssl/para proteger su servidor contra el ataque Logjam ejecutando los siguientes comandos.

$ sudo mkdir /etc/nginx/ssl
$ cd /etc/nginx/ssl
$ sudo openssl dhparam -out dhparams.pem 2048

12. Finalmente, reinicie el demonio Nginx para reflejar los cambios.

$ sudo systemctl restart nginx

y pruebe su certificado SSL visitando la siguiente URL.

https://www.ssllabs.com/ssltest/analyze.html

Paso 4: Renovación automática Encriptemos los certificados Nginx

13. Los certificados emitidos por Let’s Encrypt CA tienen una validez de 90 días. Para renovar automáticamente los archivos antes de la fecha de vencimiento, cree el script bash ssl-renew.sh en el directorio /usr/local/bin/ con el siguiente contenido.

$ sudo nano /usr/local/bin/ssl-renew.sh

Agregue el siguiente contenido al archivo ssl-renew.sh .

#!/bin/bash

cd /usr/local/letsencrypt
sudo ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www/html/ -d your_domain.tld
sudo systemctl reload nginx
exit 0

Reemplace la variable --webroot-path para que coincida con la raíz de su documento Nginx. Asegúrese de que el script sea ejecutable emitiendo el siguiente comando.

$ sudo chmod +x /usr/local/bin/ssl-renew.sh

14. Por último, agregue un trabajo cron para ejecutar el script cada dos meses a la medianoche para asegurarse de que su certificado se actualizará aproximadamente 30 días antes de que expire.

$ sudo crontab -e

Agregue la siguiente línea al final del archivo.

0 1 1 */2 * /usr/local/bin/ssl-renew.sh >> /var/log/your_domain.tld-renew.log 2>&1

¡Eso es! Su servidor Nginx ahora ofrece contenido SSL mediante un certificado SSL gratuito Let's Encrypt.