Configuración de HTTPS con el certificado SSL de Let's Encrypt para Nginx en RHEL / CentOS 7/6


Siguiendo la serie anterior de Let's Encrypt relativa al servidor web Apache o Nginx con módulo SSL/TLS, este artículo lo guiaremos sobre cómo generar e instalar un certificado SSL/TLS obtenido de forma gratuita de Let's Encrypt Certificate Authority que utilizaremos para asegurar las transacciones HTTP del servidor web Nginx en CentOS/RHEL 7/6 y Fedora distribución.

Si está buscando instalar Vamos a cifrar para Apache en RHEL/CentOS 7/6 y Fedora , siga esta guía a continuación:

  1. A registered domain name with valid A DNS records to point back to server public IP Address.
  2. Nginx web server installed with SSL enabled and Virtual Hosts enabled (only for multiple domains or subdomains hosting).

Paso 1: Instalar el servidor web Nginx

1. En el primer paso, en caso de que no tenga el daemon Nginx ya instalado, emita los siguientes comandos con privilegios de root para instalar el servidor web Nginx desde los repositorios de Epel:

# yum install epel-release
# yum install nginx

Paso 2: descargue o clone gratis Vamos a cifrar el certificado SSL

2. El método más rápido para instalar Vamos a cifrar en los sistemas Linux mediante la clonación de los paquetes de los repositorios de github .

Primero, instale git en el sistema con el siguiente comando:

# yum install git

3. Una vez que se haya instalado git client, cambie el directorio a la ruta /opt y extraiga el software de Encriptar de Let mediante los siguientes comandos:

# cd /opt
# git clone https://github.com/letsencrypt/letsencrypt

Paso 3: Generar un certificado SSL de cifrado gratuito para Nginx

4. El proceso para obtener un Certificado SSL/TLS gratuito para Nginx se realizará de forma manual utilizando Cifrado independiente plugin.

Este método requiere que el puerto 80 esté libre durante el tiempo que Encriptaremos el cliente valida la identidad del servidor y genera certificados.

Por lo tanto, si Nginx ya se está ejecutando, detenga el daemon con el siguiente comando y ejecute la utilidad ss para confirmar que el puerto 80 ya no está en uso en la pila de red.

# service nginx stop
# systemctl stop nginx
# ss -tln

5. Ahora es el momento de obtener un certificado SSL gratuito de Vamos a cifrar . Vaya al directorio de instalación de Vamos a cifrar , si aún no está allí, y ejecute el comando letsencrypt-auto con la opción certonly --standalone y la bandera -d para cada dominio o subdominio que desee generar un certificado como se sugiere en el siguiente ejemplo.

# cd /opt
# ./letsencrypt-auto certonly --standalone -d your_domain.tld -d www.yourdomain.tld

6. Después de que se instalen una serie de paquetes y dependencias en su máquina, Let´s Encrypt le solicitará que ingrese a su cuenta, la cual se usará para recuperar claves perdidas o notificaciones urgentes.

7. A continuación, debe aceptar los términos de la licencia presionando la tecla Intro .

8. Finalmente, si todo fue como debería, se mostrará un mensaje de información de felicitación en su terminal de bash. El mensaje también se mostrará cuando el certificado caducará.

Paso 4: Instalar el certificado SSL de Encrypt en Nginx

9. Ahora que posee un Certificado SSL/TLS gratuito, es el momento de instalarlo en el servidor web Nginx para que su dominio lo use.

Todos los nuevos certificados SSL se colocan en /etc/letsencrypt/live/ bajo un directorio que lleva el nombre de su nombre de dominio. Use el comando ls para enumerar los archivos de certificado emitidos para su dominio e identificarlos.

# sudo ls /etc/letsencrypt/live/
# sudo ls -al /etc/letsencrypt/live/your_domain.tld

10. Para instalar los archivos de certificado en Nginx y habilitar SSL, abra el archivo /etc/nginx/nginx.conf para editar y agregue las siguientes declaraciones después de la última línea de escucha bloque del servidor. Utilice la siguiente ilustración como guía.

# vi /etc/nginx/nginx.conf

Extracto del bloque SSL de Nginx:

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

Reemplace la cadena nombre de dominio para que los certificados SSL coincidan con su propio dominio.

11. Finalmente, reinicie el servicio Nginx y visite su dominio a través del Protocolo HTTPS en https:/sudominio . La página debe cargarse sin problemas, sin ningún error de certificado.

# systemctl restart nginx
# service nginx restart

12. Para verificar el certificado SSL/TLS y su rectitud, visite el siguiente enlace:

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

13. En caso de que reciba una notificación de que su servidor admite un intercambio de claves DH débil y una calificación general de B , genere un nuevo < fuerte> Diffie-Hellman cifrado en el directorio /etc/nginx/ssl/ para proteger su servidor contra el ataque Logjam ejecutando los siguientes comandos.

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out dhparams.pem 4096

En este ejemplo, hemos utilizado una clave de bits 4096 , que en realidad toma mucho tiempo en generarse y genera una sobrecarga adicional en su servidor y en el protocolo SSL.

En caso de que no haya una necesidad explícita de usar una clave por tanto tiempo y no sea paranoico, debe estar seguro con una clave de bits 2048 .

14. Después de generar la clave DH , abra el archivo de configuración Nginx y agregue las siguientes declaraciones después de la línea ssl_ciphers para agregar la clave DH aumente el nivel de seguridad de su dominio a un grado de A + .

# vi /etc/nginx/nginx.conf

Agregue el siguiente extracto de bloque a Nginx.conf :

ssl_dhparam /etc/nginx/ssl/dhparams.pem;
ssl_session_timeout 30m;
ssl_session_cache shared:SSL:10m;
ssl_buffer_size 8k;
add_header Strict-Transport-Security max-age=31536000;

15. Reinicie el servicio Nginx para aplicar los cambios y vuelva a probar su certificado SSL borrando la caché de resultados anterior del enlace mencionado anteriormente.

# systemctl restart nginx
# service nginx restart

Paso 5: Auto Renew Nginx Free Permite encriptar certificados SSL

16. Vamos a Encrypt CA libera SSL/TLS gratuitos válidos por 90 días. Los certificados se pueden renovar y aplicar manualmente antes del vencimiento mediante el complemento webroot, sin detener su servidor web, emitiendo los siguientes comandos:

# ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html/ -d yourdomain.tld -d www.yourdomain.tld
# systemctl reload nginx

Al ejecutar el comando anterior, asegúrese de reemplazar el webroot-path para que coincida con la raíz del documento de su servidor web, especificado por la declaración de la raíz Nginx.

17. Para renovar automáticamente el certificado antes de que caduque, cree este script bash desde github erikaheidi en el directorio /usr/local/bin/ y agregue el contenido a continuación (el script está ligeramente modificado para reflejar la configuración de Nginx).

# vi /usr/local/bin/cert-renew

Agregue las siguientes líneas al archivo cert-renew .

#!/bin/bash

webpath='/usr/share/nginx/html/'
domain=$1
le_path='/opt/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
        certdomain=$1
        config_file="$le_conf/renewal/$certdomain.conf"

        if [ ! -f $config_file ] ; then
                echo "[ERROR] The config file for the certificate $certdomain was not found."
                exit 1;
        fi

        domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
        last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')

        if [ "${last_char}" = "," ]; then
                domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
        fi

        echo $domains;
}

if [ -z "$domain" ] ; then
        echo "[ERROR] you must provide the domain name for the certificate renewal."
        exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"

if [ ! -f $cert_file ]; then
        echo "[ERROR] certificate file not found for domain $domain."
        exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."

if [ "$days_exp" -gt "$exp_limit" ] ; then
        echo "The certificate is up to date, no need for renewal ($days_exp days left)."
        exit 0;
else
        echo "The certificate for $domain is about to expire soon. Starting renewal request..."
        domain_list=$( get_domain_list $domain )
"$le_path"/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=”$webpath” --domains "${domain_list}"
        echo "Reloading Nginx..."
sudo systemctl reload nginx
        echo "Renewal process finished for domain $domain"
        exit 0;
fi

18. Reemplace la variable desde el principio de la secuencia de comandos para que coincida con la raíz de su documento Nginx. Asegúrese de que el script sea ejecutable y que la calculadora bc esté instalada en su sistema emitiendo los siguientes comandos.

# chmod +x /usr/local/bin/cert-renew
# yum install bc

Puede probar el script contra su dominio emitiendo el siguiente comando:

# /usr/local/bin/cert-renew yourdomain.tld

19. Finalmente, para ejecutar el proceso de renovación de certificado automáticamente, agregue un nuevo trabajo cron para ejecutar el script todas las semanas para actualizar el certificado dentro de los 30 días anteriores a la fecha de vencimiento.

# crontab -e

Agregue la siguiente línea en la parte inferior del archivo.

@weekly  /usr/local/bin/cert-renew your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1

¡Eso es todo! Ahora el servidor Nginx puede entregar contenido web seguro con un certificado gratuito SSL/TLS Let's Encrypt en su sitio web.