Como ya sabéis cada día es más necesario tener todas nuestras conexiones cifradas por eso voy a enseñar como tener un certificado SSL gratuito en nuestro Nginx con Centos 7.

Instalar paquetes necesarios

Primero instalamos el repositorio de epel

sudo yum install -y epel-release  

Y a continuación comenzamos con la instalación de lestencrypt mediante el paquete certbot

sudo yum install -y certbot  
Configuración

Una vez instalado tenemos que ir a la configuración del Nginx del domino en cuestión yo pongo como ejemplo alesanderlopez.es

server {  
    listen 80;

    server_name alesanderlopez.es;
    limit_req zone=login burst=25;
    location / {
        proxy_pass http://127.0.0.1:2368;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Añadimos las siguientes lineas a la configuración

location ~ /.well-known {  
        allow all;
}

Y debería quedar algo así

server {  
    listen 80;

    server_name alesanderlopez.es;
    limit_req zone=login burst=25;
    location / {
        proxy_pass http://127.0.0.1:2368;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~ /.well-known {
        allow all;
    }
}

Ahora reiniciamos el nginx

sudo systemctl restart nginx  
Generamos los Certificados

Ahora lanzamos el comando

sudo certbot certonly -a webroot --webroot-path=/usr/share/nginx/html -d alesanderlopez.es  

Añadimos nuestro correo por si necesitamos recuperar los certificados y seguimos con el proceso y nos debería salir un mensaje como el siguiente.

IMPORTANT NOTES:  
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/alesanderlopez.es/fullchain.pem. Your cert
   will expire on 2017-03-30. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to ales.sander93@gmail.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

[root@zeus ~]#

Si el mensaje no es este y es de error continua con el proceso de configuración del nginx sobre el dominio.

Nuestro certificados están en /etc/letsencrypt/live/alesanderlopez.es/

[root@zeus ~]# sudo ls -l /etc/letsencrypt/live/alesanderlopez.es/
total 0  
lrwxrwxrwx 1 root root 41 dic 30 13:51 cert.pem -> ../../archive/alesanderlopez.es/cert1.pem  
lrwxrwxrwx 1 root root 42 dic 30 13:51 chain.pem -> ../../archive/alesanderlopez.es/chain1.pem  
lrwxrwxrwx 1 root root 46 dic 30 13:51 fullchain.pem -> ../../archive/alesanderlopez.es/fullchain1.pem  
lrwxrwxrwx 1 root root 44 dic 30 13:51 privkey.pem -> ../../archive/alesanderlopez.es/privkey1.pem  
[root@zeus ~]#

Ahora para mejorar la seguridad vamos a crear una clave privada del famoso algoritmo Diffie-Hellman, tardará un rato aprovechad para ir a beber agua.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048  

Ahora tenemos todo solamente nos queda añadir el fichero ssl.conf de nginx si no lo tenemos y si lo tenemos modificar el que ya tenemos

sudo vim /etc/nginx/conf.d/ssl.conf  

Y debería quedar así para los que tengáis proxy en nginx.

server {  
    listen 443 ssl;

    server_name alesanderlopez.es www.alesanderlopez.es;

    ssl_certificate /etc/letsencrypt/live/alesanderlopez.es/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/alesanderlopez.es/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;

    location / {
        proxy_pass http://127.0.0.1:2368;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~ /.well-known {
        allow all;
    }
}

Ahora reiniciamos el nginx

sudo systemctl restart nginx  

Y ya podemos probar que el certificado funciona correctamente a través del navegador.

Siempre es recomendable medir la calidad de nuestra configuración SSL de forma periódica yo lo voy a hacer con www.ssllabs.com

ssllabs alesanderlopez.es

Y como podemos observar al hacer la prueba hemos obtenido la puntuación más alta un A+ por lo que nuestras conexiones privadas están completamente seguras.

Actualizar el certificado automaticamente.

Los certificados tienen una caducidad de 3 meses por lo que hay que ejecutar de forma periodica el siguiente comando:

sudo certbot renew  

Seguramente se nos olvide ejecutarlo la proxima ves que este cerca de caducar por eso mejor añadirlo al crontab de nuestro linux.

sudo crontab -e  

Y añadir lo siguiente:

# lestencrypt
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log  
35 2 * * 1 /usr/bin/systemctl reload nginx  

Esto es todo ya tenemos todo listo.

© 2017. All Rights Reserved.