Configuració d'HTTPS amb el certificat SSL de Let's Encrypt per a Nginx a RHEL/CentOS 7/6


Després de l'anterior sèrie Let's Encrypt sobre servidor web Apache o Nginx amb mòdul SSL/TLS, aquest article us guiarem sobre com generar i instal·lar un certificat SSL/TLS obtingut de forma gratuïta de Let's Encrypt Certificate Authority que farem servir per assegurar les transaccions HTTP del servidor web Nginx a la distribució CentOS/RHEL 7/6 i Fedora.

Si voleu instal·lar Let's Encrypt per a Apache a les distribucions RHEL/CentOS 7/6 i Fedora, seguiu aquesta guia a continuació:

  1. Un nom de domini registrat amb registres A DNS vàlids per apuntar cap a l'adreça IP pública del servidor.
  2. Servidor web Nginx instal·lat amb SSL activat i Hosts virtuals habilitats (només per a múltiples dominis o subdominis d'allotjament).

Pas 1: instal·leu el servidor web Nginx

1. Al primer pas, en cas que no tingueu instal·lat el dimoni Nginx, emeteu les ordres següents amb privilegis d'arrel per instal·lar el servidor web Nginx des dels dipòsits d'Epel:

# yum install epel-release
# yum install nginx

Pas 2: Baixeu o cloneu gratuïtament el certificat SSL de Let's Encrypt

2. El mètode més ràpid per instal·lar el client Let's Encrypt als sistemes Linux clonant els paquets dels repositoris github.

Primer, instal·leu el client git al sistema amb l'ordre següent:

# yum install git

3. Un cop instal·lat el client git, canvieu el directori a la ruta /opt i traieu el programari Let's Encrypt executant les ordres següents:

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

Pas 3: genereu un certificat SSL de Let's Encrypt gratuït per a Nginx

4. El procés d'obtenció d'un certificat SSL/TLS gratuït per a Nginx es farà manualment mitjançant el connector Let's Encrypt Standalone.

Aquest mètode requereix que el port 80 estigui lliure durant el temps que el client Let's Encrypt validi la identitat del servidor i generi certificats.

Per tant, si Nginx ja s'està executant, atureu el dimoni amb l'ordre següent i executeu la utilitat ss per confirmar que el port 80 ja no s'utilitza a la pila de xarxa.

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

5. Ara és el moment d'obtenir un certificat SSL gratuït de Let's Encrypt. Aneu al directori d'instal·lació de Let's Encrypt, si encara no hi sou, i executeu l'ordre letsencrypt-auto amb l'opció certonly --standalone i -d marca per a cada domini o subdomini que voleu generar un certificat tal com es suggereix a l'exemple següent.

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

6. Després d'instal·lar una sèrie de paquets i dependències a la vostra màquina, Let's Encrypt us demanarà que introduïu el vostre compte que s'utilitzarà per a la recuperació de claus perdudes o per a notificacions urgents.

7. A continuació, hauríeu d'acceptar els termes de la llicència prement la tecla Enter.

8. Finalment, si tot ha anat com hauria de ser, es mostrarà un missatge d'informació de felicitació al vostre terminal bash. El missatge també es mostrarà quan el certificat caduqui.

Pas 4: instal·leu el certificat SSL Let's Encrypt a Nginx

9. Ara que teniu un certificat SSL/TLS gratuït, és hora d'instal·lar-lo al servidor web Nginx per tal que el vostre domini l'utilitzi.

Tots els certificats SSL nous es col·loquen a /etc/letsencrypt/live/ sota un directori que porta el nom del vostre nom de domini. Utilitzeu l'ordre ls per llistar els fitxers de certificat emesos per al vostre domini i identificar-los.

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

10. Per instal·lar els fitxers de certificat a Nginx i habilitar SSL, obriu el fitxer /etc/nginx/nginx.conf per editar-lo i afegiu les declaracions següents després de l'última línia d'escolta del bloc del servidor. Utilitzeu la il·lustració següent com a guia.

# vi /etc/nginx/nginx.conf

Fragment del bloc 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';

Substituïu la cadena de nom de domini per als certificats SSL perquè coincideixi amb el vostre propi domini.

11. Finalment, reinicieu el servei Nginx i visiteu el vostre domini mitjançant el protocol HTTPS a https://yourdomain. La pàgina s'ha de carregar sense problemes, sense cap error de certificat.

# systemctl restart nginx
# service nginx restart

12. Per verificar el certificat SSL/TLS i la seva rectitud, visiteu el següent enllaç:

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

13. En cas que rebeu una notificació que el vostre servidor admet un intercanvi de claus DH feble i una qualificació general de grau B, genereu un nou xifratge Diffie-Hellman al directori /etc/nginx/ssl/ per protegir el vostre servidor contra l'atac de Logjam. executant les ordres següents.

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

En aquest exemple hem utilitzat una clau de 4096 bits, que en realitat triga molt de temps a generar-se i suposa una sobrecàrrega addicional al vostre servidor i a l'enllaç SSL.

En cas que no hi hagi necessitat explícita d'utilitzar una clau durant tant de temps i no siguis paranoic, hauríeu d'estar segur amb una clau de 2048 bits.

14. Un cop generada la clau DH, obriu el fitxer de configuració Nginx i afegiu les declaracions següents després de la línia ssl_ciphers per afegir la clau DH i augmentar el nivell de seguretat del vostre domini a un A+ grau.

# vi /etc/nginx/nginx.conf

Afegiu el següent fragment de bloc 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. Reinicieu el servei Nginx per aplicar canvis i tornar a provar el vostre certificat SSL esborrant la memòria cau de resultats anterior de l'enllaç esmentat anteriorment.

# systemctl restart nginx
# service nginx restart

Pas 5: la renovació automàtica de Nginx gratuïta permet xifrar els certificats SSL

16. Let's Encrypt CA publica certificats SSL/TLS gratuïts vàlids durant 90 dies. Els certificats es poden renovar i aplicar manualment abans de la caducitat mitjançant el connector webroot, sense aturar el servidor web, emetent les ordres següents:

# ./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

Quan executeu l'ordre anterior, assegureu-vos de substituir el webroot-path perquè coincideixi amb l'arrel del document del vostre servidor web, especificat per la instrucció arrel de Nginx.

17. Per renovar automàticament el certificat abans que caduqui, creeu aquest script bash des del github erikaheidi al directori /usr/local/bin/ i afegiu el contingut següent (l'script està lleugerament modificat per reflectir la configuració de Nginx).

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

Afegiu les línies següents al fitxer 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. Substituïu la variable $webpath des de l'inici de l'script perquè coincideixi amb l'arrel del document Nginx. Assegureu-vos que l'script sigui executable i que la calculadora bc estigui instal·lada al vostre sistema emetent les ordres següents.

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

Podeu provar l'script amb el vostre domini emetent l'ordre següent:

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


19. Finalment, per executar el procés de renovació del certificat automàticament, afegiu un nou treball de cron per executar l'script cada setmana per actualitzar el certificat dins dels 30 dies anteriors a la data de caducitat.

# crontab -e

Afegiu la línia següent a la part inferior del fitxer.

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

Això és tot! Ara el servidor Nginx pot oferir contingut web segur amb un certificat SSL/TLS gratuït Let's Encrypt al vostre lloc web.