Que es Let’s Encrypt?
Let’s encrypt es una Autoridad de Certificados (CA) que nos brinda la posibilidad de obtener de manera gratuita certificados, pudiendo asi habilitar el protocolo HTTPS en nuestros servidores web. Gracias al cliente que ellos proveen podemos automatizar prácticamente todos los pasos.
En este tutorial vamos a ver como usar Let’s Encrypt para obtener un certificado SSL gratuito y usarlo en nuestro servidor de Nginx en Ubuntu 14.04. Así mismo les mostrare como renovar un certificado de Let’s Encrypt automáticamente.
Requisitos
Antes de comenzar con el tutorial repasemos las cosas que necesitamos para poder cumplir nuestra misión:
- Debemos contar con un servidor, con un usuario de acceso «no root» que tenga privilegios de sudo.
- Debemos tener el dominio al cual queremos aplicar el certificado registrado y apuntado a nuestro servidor
Paso 1: Instalar el cliente de Le’ts Encrypt
Lo primero que debemos hacer para poder pedir nuestro certificado es instalar el cliente de letsencrypt en nuestro servidor, la mejor manera de hacerlo es simplemente clonando el proyecto desde GitHub:
Instalar Git y BC:
Empezaremos por actualizar nuestro servidor con el comando:
sudo apt-get update
Luego instalaremos git y bc:
sudo apt-get -y install git bc
Una vez completada la instalación ya podemos clonar el repositorio.
Clonar Let’s Encrypt
Vamos a clonar el repositorio de let’s encrypt a la carpeta /opt:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Paso 2: Obtener el certificado
Let’s encrypt nos permite obtener los certificados SSL de varias maneras y a través de varios plugins, a continuación usaremos el plugin de Webroot para obtener un certificado.
Como usar el plugin de Webroot
El plugin funciona escribiendo un archivo especial en una carpeta llamada «well-known» en la raíz de nuestra web.
Si todavía no se encuentra instalado Nginx lo haremos con este comando:
sudo apt-get install nginx
Para asegurarnos que el directorio sea accesible de manera que Let’s Encrypt pueda hacer la validación de nuestro dominio, haremos un pequeño cambio en la configuración de Nginx. De manera predeterminada esta configuración se encuentra ubicada en /etc/nginx/sites-available/default, vamos a usar nano para editarla:
sudo nano /etc/nginx/sites-available/default
Una vez abierto el archivo, insertaremos este código dentro del bloque «server»:
location ~ /.well-known {
allow all;
}
Ya podemos guardar el documento y reiniciar Nginx utilizando el comando:
sudo service nginx reload
Llego el momento de utilizar el plugin de Webroot para solicitar nuestro certificado, lo haremos con el siguiente comando (especificaremos nuestro dominio con la opción -d, debemos tener en cuenta de especificar todos los dominios con los que debe funcionar).
cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d midominio.com -d www.midominio.com
Una vez que letsencrypt haya cargado, nos ira pidiendo cierta información, en la primer pantalla nos solicitara nuestro correo electrónico:
En la siguiente pantalla deberemos aceptar los términos y condiciones de Let’s Encrypt:
Si todo salio bien nos encontraremos con un mensaje similar a este:
Output:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to yo@midominio.com
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/midominio.com/fullchain.pem. Your
cert will expire on 2016-03-15. 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
Vamos a querer tomar nota de donde se ubico el certificado y cuando vence el mismo.
Archivos del certificado:
Después de obtener el certificado, tendremos los siguientes archivos:
- cert.pem: El certificado de nuestro dominio
- chain.pem: El certificado del chain de Let’s Encrypt
- fullchain.pem: cert.pem y chain.pem combinados
- privkey.pem: La llave privada de nuestro certificado
Chequearemos que los archivos existen usando el link simbólico que crea el cliente de let’s encrypt automáticamente:
sudo ls -l /etc/letsencrypt/live/midominio
Si todo salio bien nos listara los archivos del cuadro de arriba.
Generar un grupo Strong Diffie-Hellman:
Para aumentar la seguridad, vamos a generar un grupo strong Diffie-Hellman. Para generar un grupo de 2048 bits usaremos el comando:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Esto puede llevar unos minutos, una vez finalizado tendremos nuestro grupo en: /etc/ssl/certs/dhparam.pem
Paso 3: Configurar TLS/SSL en nuestro Web Server (nginx)
Ahora que tenemos el certificado, debemos hacer que Nginx lo use.
Editaremos entonces el archivo de configuracion que posee el bloque «server» (se encuentra en /etc/nginx/sites-available/default:
sudo nano /etc/nginx/sites-available/default
Borraremos las lineas que hacen que nuestro servidor escuche en el puerto 80 borrando lo siguiente:
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
A continuación configuraremos este bloque servidor para escuchar en el puerto 443 con SSL habilitado, dentro de nuestro bloque server {, agregaremos las siguientes lineas reemplazando midominio.com con el nombre de nuestro dominio:
listen 443 ssl;
server_name midominio.com www.midominio.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Para asegurarnos que solo se utilicen los protocolos de ssl y ciphers mas seguros (usando el grupo que generamos anteriormente) agregaremos las siguientes lineas en el mismo bloque de server:
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 ultimo vamos a hacer que todo lo que ingrese por el puerto 80 sea redireccionado al 443, para esto tenemos que poner lo siguiente fuera del bloque server que estuvimos modificando en el paso anterior (como siempre reemplazar midominio.com con el nombre de nuestro dominio).
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Guardar el archivo y salir del editor.
Para aplicar los cambios reiniciaremos el nginx con el comando:
sudo service nginx reload
Revisaremos que todo este funcionando ingresando desde un explorador a nuestro sitio con el protocolo HTTPS.
Paso 4: Como configurar la auto renovación del certificado de Let’s Encrypt
Los certificados de Let’s Encrypt son validos por 90 días, para estar seguros que nunca vencerán, configuraremos una auto renovación cada 60 días. Esto es muy sencillo y automatizado, lo único que debemos hacer es correr el comando /opt/letsencrypt/letsencrypt-auto renew.
Haremos esto dentro de un cron para poder automatizar la tarea, para esto correremos:
sudo crontab -e
Y agregaremos estas dos lineas:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload
Julio Barnils