Como instalar Nginx y Let’s Encrypt en Ubuntu 14

julio-barnils-let's-encrypt

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.

julio-barnils-nginx-letsencrypt

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:

le-email

En la siguiente pantalla deberemos aceptar los términos y condiciones de Let’s Encrypt:

le-agreement

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

Deja un comentario