Cómo configurar un certificado SSL gratuito "Let's Encrypt" en Nginx (Ubuntu)

Si has leído muchos artículos sobre consejos de privacidad, seguramente te habrás encontrado con un consejo que te pide que instales la extensión “HTTPS en todas partes” para que te redirija automáticamente a la versión HTTPS del sitio web siempre que sea posible. Lo malo es que la extensión HTTPS en todas partes solo funciona cuando el sitio web que estás visitando ha implementado SSL, y para la mayoría de los webmasters, eso puede ser una tarea difícil (y costosa) por sí misma. Afortunadamente, con el movimiento Let’s Encrypt, es más fácil para los webmasters añadir certificados SSL a sus sitios ahora.

En el pasado (y actualmente), configurar un certificado SSL requiere que primero generes una clave privada en tu servidor, luego compres un certificado SSL de la Autoridad de Certificación (que puede ser costoso) y, por último, lo configures en el servidor. Hay mucha tecnicidad involucrada en el proceso, y no hacerlo correctamente hará que el certificado SSL sea inútil. Con el proyecto Let’s Encrypt, uno puede agregar rápidamente un certificado SSL a sus sitios sin ningún costo. Y al estar respaldado por grandes actores de la industria como Mozilla, Akamai, Cisco, EFF y Google, es compatible con la mayoría de navegadores y sistemas operativos.

En este tutorial, revisaremos los pasos para configurar el certificado SSL de Let’s Encrypt en el servidor Nginx. Estamos usando un servidor Ubuntu 14.04 para este tutorial y suponemos que estás utilizando un servidor Nginx Ubuntu funcional. Las instrucciones pueden diferir para el servidor Ubuntu 16.04.

Instalar Let’s Encrypt

Primero, para instalar Let’s Encrypt, necesitarás git para clonarlo desde su repositorio git. Instala git con el siguiente comando:

sudo apt-get install git bc

Una vez instalado, clona el repositorio de Let’s Encrypt:

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

Configurando el entorno

Antes de proceder a instalar y configurar el certificado SSL, es importante permitir el acceso a la carpeta .well-known en el directorio raíz de la web. Por defecto, todos los archivos y carpetas con un “.” delante del nombre de archivo están ocultos y no son accesibles al público. Sin embargo, en este caso necesitaremos proporcionar permiso para que el público acceda a la carpeta .well-known, ya que aquí es donde Let’s Encrypt almacenará un archivo especial para la validación.

Dirígete a la carpeta de configuración de tu sitio Nginx y ábrela (si tienes un archivo de configuración personalizado para tu sitio) o usa la predeterminada:

cd /etc/nginx/sites-available  
sudo nano default

Agrega las siguientes líneas en el bloque del servidor:

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

Guarda (Ctrl + O) y cierra (Ctrl + X) el archivo de configuración.

Prueba la configuración de tu Nginx:

sudo nginx -t

Si toda la configuración funciona bien, recarga la configuración:

sudo service nginx reload

Generar un certificado SSL

Ahora que has terminado con la configuración de Nginx, lo siguiente es instalar el certificado SSL.

Ve a la carpeta de Let’s Encrypt:

cd /opt/letsencrypt

Ejecuta el siguiente comando para generar el certificado:

./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com

Hay algunas cosas que cambiar aquí:

  • Cambia el webroot-path a la ruta del documento raíz de tu sitio. El predeterminado es “/usr/share/nginx/html”, pero tu configuración puede diferir.
  • Cambia “example.com” por tu propio nombre de dominio. Ten en cuenta que “example.com” y “www.example.com” son dos dominios diferentes. Si deseas que el certificado soporte múltiples dominios, simplemente agrega -d example1.com al final del comando. Por ejemplo, para configurar un certificado SSL para los dominios “example.com”, “www.example.com”, “example1.com” y “www.example1.com”, usa el siguiente comando:
./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com -d example1.com -d www.example1.com

En la primera ejecución, el script instalará un montón de archivos de Python en tu sistema. Una vez que termine, comenzará el proceso de generación del certificado. Primero te pedirá tu dirección de correo electrónico:

nginx-letsencrypt-email-address

Después te pedirá que leas los Términos de Servicio en el sitio web de Let’s Encrypt. Selecciona “Acepto.”

nginx-letsencrypt-read-tos

Si ves el siguiente mensaje:

NOTAS IMPORTANTES:  
 - ¡Felicidades! Tu certificado y cadena han sido guardados en  
/etc/letsencrypt/live/example.com/fullchain.pem. Tu cert  
   expirará el 2016-10-02. Para obtener una nueva versión o una versión modificada  
   de este certificado en el futuro, simplemente ejecuta letsencrypt-auto de nuevo.  
   Para renovar *todas* tus certificaciones de forma no interactiva, ejecuta  
"letsencrypt-auto renew"  
 - Si te gusta Certbot, considera apoyar nuestro trabajo:  
  
   Donando a ISRG / Let's Encrypt:   https://letsencrypt.org/donate  
   Donando a EFF:                    https://eff.org/donate-le

Eso significa que has generado exitosamente un certificado SSL para tu(s) sitio(s). Si en cambio ves un mensaje de error, corrige el error y vuelve a intentarlo.

Activando el certificado SSL para tu sitio

Ahora que has generado el certificado SSL, es hora de activarlo para tu sitio.

Regresa a la carpeta de configuración de Nginx y abre el archivo de configuración del sitio:

cd /etc/nginx/sites-available  
sudo nano default

Crea un nuevo bloque de servidor y agrega la siguiente configuración dentro del bloque:

server {  
        server_name example.com www.example.com;  
  
        listen 443 ssl;  
  
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  
}

Guarda y cierra el archivo.

Nota: lo anterior es una versión simplificada del bloque de configuración de Nginx. Debes agregar tu propia configuración personalizada en el bloque.

Por último, prueba la configuración:

sudo nginx -t

Si todo está bien, recarga Nginx:

sudo service nginx reload

Eso es todo. Has configurado exitosamente un certificado SSL para tus sitios. Ahora puedes cargar la versión “https” de tu URL para verlo en acción.

Renovación automática de un certificado SSL de Let’s Encrypt

A diferencia de la mayoría de los certificados SSL comerciales que son válidos por un mínimo de un año, un certificado SSL de Let’s Encrypt solo es válido por tres meses. Después de este tiempo, tendrás que renovarlo para seguir utilizándolo. Let’s Encrypt viene con una opción renew para que puedas renovar fácilmente tus certificados sin pasar por toda la instalación de nuevo. Las siguientes instrucciones te muestran cómo configurar un trabajo cron para la renovación automática de tu certificado SSL.

Aún en tu servidor, abre el crontab:

sudo crontab -e

Agrega las siguientes líneas:

00 0 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log  
05 0 * * 1 /etc/init.d/nginx reload

Las líneas anteriores verificarán la fecha de expiración de tus certificados SSL todos los lunes a las 12 am y los renovará si están cerca de expirar. También recargará Nginx (a las 12:05 am) para asegurarse de que el certificado renovado está en uso.

Guarda y cierra el crontab.

Conclusión

Si estás ejecutando un pequeño sitio web y te interesa añadir SSL a tu sitio, Let’s Encrypt es una gran opción para añadir credibilidad a tu sitio. Es (relativamente) fácil de configurar y no cuesta nada (gratuito, como en cerveza), así que no hay razón para no hacerlo. Sin embargo, dado que solo proporciona un certificado Validado por Dominio (DV) (el tipo más básico de certificado SSL) para aquellas empresas que requieren certificados de SSL Validados por Organización (OV) o de Validación Extendida (EV), probablemente un certificado SSL comercial sea el camino a seguir.