Jul032016

Asegura tu sitio web Nginx con Let’s Encrypt

letsencryptHasta hace poco tiempo, si queríamos aceptar conexiones seguras en nuestros sitios web debíamos pagar a una autoridad certificadora para que nos generase un certificado TLS/SSL. Let’s Encrypt a llegado para cambiar las cosas, como nueva entidad certificadora que nos provee de certificados gratuitos, que podemos generar nosotros mismos usando las herramientas que nos provee.

Hace apenas unas horas, he solicitado e instalado nuestros nuevos certificados TLS/SSL, por lo que a partir de ahora nuestro blog acepta conexiones seguras. Ahora voy a compartir con ustedes como lo he hecho.

 

Requisitos

Para poder seguir este tutorial necesitaremos tener Nginx configurado y funcionando en un servidor Ubuntu (puede que funcione igual en cualquier Debian o derivado) con acceso SSH y privilegios de súper usuario, bien sea mediante login como root o mediante sudo. Si este no es tu caso, te recomiendo que empieces leyendo nuestro artículo sobre Como crear un blog WordPress en DigitalOcean.

Debemos tener control de nuestro domino web y asegurarnos de que las entradas A del servidor de DNS apuntan a la IP pública de nuestro servidor web. Por ejemplo, si deseamos obtener un certificado para ejemplo.com, ese dominio debe apuntar a nuestro servidor para que el proceso de validación lo acepte.

Instalar cliente Let’s Encrypt

Lo primero que tenemos que hacer es instalar el cliente de Let’s Encrypt en nuestro servidor, por lo que empecemos instalando algunos requisitos.

$ sudo apt-get update
$ sudo apt-get -y install git bc

Ahora descargamos el cliente de Let’s Encrypt en /opt/letsencrypt

$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Solicitar un certificado

Let’s Encrypt proporciona varias formas de obtener los certificados SSL, a través de varios plugins. A diferencia del plugin de Apache, del que no vamos a hablar en esta ocasión, la mayoría de los plugins sólo ayudan con la obtención de un certificado que se debe configurar manualmente el servidor web para su uso. A los plugins que sólo obtienen certificados, y no los instalan, se les conoce como “verificadores”, ya que se utilizan para autenticar si un a servidor se debe emitir un certificado.

Aquí vamos a explicar cómo utilizar el plugin Webroot para obtener un certificado SSL.

Cómo usar el plugin Webroot

El plugin Webroot funciona colocando un archivo especial en el directorio /.well-known dentro de la raíz del documento, que el servicio de validación de Let’s Encrypt podrá descargar a través de nuestro servidor web.

Para asegurarnos de que el directorio es accesible por el servicio de validación de Let’s Encrypt, vamos a hacer un cambio rápido a nuestra configuración de Nginx añadiendo estas líneas al bloque server del fichero de configuración de nuestro sitio web /etc/nginx/sites-available/ejemplo.com (puede que en tu caso la ruta sea diferente):

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

También tendremos que buscar y anotar la directiva root de nuestro sitio web, en nuestro caso es /usr/share/nginx/ejemplo.com/html, ya que se requiere la ruta a utilizar el plugin  Webroot.

Una vez hayamos añadido las lineas de arriba y anotado la ruta raiz de nuestro servidor web, guardamos los cambios y recargamos la configuración de Nginx:

$ sudo service reload nginx

Ahora podemos utilizar el plugin de Webroot para solicitar un certificado SSL con el comando de abajo. Aquí, también estamos especificando los nombres de dominio con la opción -d. Si deseas un solo certificado para trabajar con varios nombres de dominio, por ejemplo, ejemplo.com y www.ejemplo.com, asegúrese de incluirlos todos. Además, asegúrate de reemplazar las partes resaltadas con la ruta raíz de tu servidor web  y los nombres de dominio:

$ sudo /opt/letsencrypt/letsencrypt-auto certonly -a webroot --webroot-path=/var/www/ejemplo.com/html -d ejemplo.com -d www.ejemplo.com

Este proceso solicitará alguna información. Las indicaciones exactas pueden variar dependiendo de si hemos utilizado Let’s Encrypt antes. Primero solicitará una dirección de correo electrónico que se utilizará para las notificaciones y recuperación de claves en caso de pérdida y a continuación debemos indicar que estamos de acuerdo con las condiciones de servicio de Let’s Encrypt.

Si todo se ha realizado correctamente, debería aparecer un mensaje de salida parecido a este:

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to sammy@digitalocean.com
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/ejemplo.com/fullchain.pem. Your
   cert will expire on 2016-01-10. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   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 Let's
   Encrypt so making regular backups of this folder is ideal.
 - If like Let's Encrypt, please consider supporting our work by:

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

Es importante ser consciente de la ubicación de los archivos de certificado que acabamos de crear, para poder utilizarlos en la configuración del servidor web. Los archivos se colocan en un subdirectorio en /etc/letsencrypt/archive . Sin embargo, Let’s Encrypt crea enlaces simbólicos a los certificados más recientes en el directorio /etc/letsencrypt/live/ejemplo.com. Debido a que los enlaces siempre apuntarán a los certificados más recientes, esta es ruta que se debe usar para hacer referencia a los certificados.

Generar un grupo Diffie-Hellman seguro

Para aumentar aún más la seguridad, también debemos generar un grupo Diffie-Hellman seguro. Para generar un grupo de 2048 bits, utilizamos este comando:

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

Este proceso puede tardar unos minutos, pero cuando termine que tendremos un grupo DH seguro en /etc/ssl/certs/dhparam.pem.

Añadir los certificados a Nginx

Ahora toca volver a editar el fichero de configuración de Nginx para nuestro dominio.

Primero hay que cambiar el puerto en el que nuestro serviodor escucha, por lo que buscaremos las líneas parecidas a estas:

listen 80;
listen [::]:80;

Cambiaremos el 80 por un 443 y añadiremos algunas líneas extra debajo, quedando algo parecido a esto:

listen 443 ssl;
listen [::]:443 ssl;

ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/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;

Por último, fuera del bloque servidor original (que está a la escuchando HTTPS, puerto 443), hay que añadir este bloque servidor para redirigir las peticiones HTTP (puerto 80) a HTTPS:

server {
    listen 80;
    server_name ejemplo.com www.ejemplo.com;
    return 301 https://$host$request_uri;
}

Una vez más, guardamos los cambios y recargamos la configuración de Nginx:

$ sudo service nginx reload

Si todo ha ido bien, los certificado TLS/SSL de Let’s Encrypt ya están en marcha. En este punto, podremos comprobar que nuestra web usa nuestros certificados visitándolo a través de HTTPS en un navegador web.

También podemos usar el servicio de Qualys SSL Labs Report para ver la puntuación de seguridad de nuestros certificados en https://www.ssllabs.com/ssltest/analyze.html?d=ejemplo.com.

Renovación automática de los certificados

Los certificados de Let’s Encrypt tienen una validez de 90 días, pero se recomienda renovarlos cada 60 días, para permitir un margen de error. La renovación automática todavía no está disponible como una característica del propio cliente, por lo que es necesario renovar los certificados de forma manual mediante la ejecución de cliente Let’s Encrypt con la opción renew. Pero no queremos estar pendientes de hacer esto cada 60 días manualmente, por lo que vamos a usar el servicio cron de nuestro servidor para que lo haga automáticamente por nosotros.

Vamos a editar el crontab para crear un nuevo trabajo que ejecutará el comando de renovación todas las semanas. Para editar el crontab usamos este comando:

sudo crontab -e

Ahora añadimos estas líneas al fichero y guardamos:

30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Actualización del cliente Let’s Encrypt (opcional)

Siempre hay nuevas actualizaciones disponibles para el cliente, podemos actualizarlo ejecutando un git pull desde el interior del directorio Let’s Encrypt:

$ cd /opt/letsencrypt
$ sudo git pull

Y esto es todo, espero que este articulo te sea de utilidad y, como siempre, estás invitado a comentar cualquier duda o aportación.

Este tutorial está basado en el publicado por Mitchell Anicas en la comunidad de DigitalOcean (en inglés).

Política de comentarios

Dada la importancia de los comentarios como espacio de participación, te pedimos por favor que leas detenidamente y cumplas con las siguientes normas de participación.

4 respuestas para “Asegura tu sitio web Nginx con Let’s Encrypt

Isaac Palacio

Interesante articulo me guardo para implementarlo


Elías R.M.

Me alegro de que te haya gustado.

Saludos


Rafael Ortiz

Me gusto mucho tu articulo, pero sabes donde podría encontrar mas documentación sobre como utilizar el entorno de desarrollo de Let’s Encrypt, gracias!!!


José Miguel

Hola Rafael, no soy el autor del post. A la espera de una mejor respuesta, yo comenzaría por su página oficial.
https://letsencrypt.org/

Saludos.


Deja un comentario

Tu dirección de correo electrónico no será publicada.