Hace algunos años, asegurar un sitio web con un certificado SSL era prácticamente solo para quienes tenían transacciones monetarias o manejaban información importante de los usuarios, pero hoy en día es casi un requisito obligatorio para cualquier sitio, sin importar cuál sea su utilidad. En este post estaremos hablando sobre cómo asegurar un sitio web de nginx por medio de Let’s Encrypt en Ubuntu 16.04.

Let’s Encrypt es una autoridad de certificación que se puso en marcha en abril del 2016 y proporciona certificados gratuitos para el cifrado de seguridad de nivel de transporte (TLS) a través de un proceso sencillo de creación, instalación y renovación de certificados de sitios web seguros.

Prerrequisitos

Para poder seguir con este tutorial deberás tener lo siguiente:

  • Servidor Ubuntu 16.04 con su respectiva configuración inicial.
  • Un nombre de dominio registrado. En este tutorial utilizaremos el dominio ejemplo.com, sin embargo, puedes comprar un nombre de dominio en Namecheap o usar el de tu elección.
  • Tener dos registros DNS apuntando a tu servidor (la manera en que se configura el DNS puede variar dependiendo del registrador de dominios que elijas):
    • Un registro de tipo A con el nombre ejemplo.com apuntando a la IP pública de tu servidor.
    • Un registro de tipo A con el nombre www.ejemplo.com apuntando a la IP pública de tu servidor.
  • Tener nginx instalado.

Paso 1 – Instalación de Certbot

El primer paso para utilizar Let’s Encrypt y obtener certificados SSL es instalar el software Certbot en tu servidor.

Certbot está actualmente en desarrollo y los paquetes que proporciona Ubuntu para su instalación suelen estar desactualizados. Sin embargo, los desarrolladores de Certbot mantienen un repositorio de Ubuntu con las versiones más recientes de este software, así que vamos a usar este repositorio en su lugar.

Primero debemos añadir el repositorio:

sudo add-apt-repository ppa:certbot/certbot

Luego debemos presionar ENTER para aceptar y posteriormente debemos actualizar los paquetes para poder hacer uso del nuevo repositorio:

sudo apt-get update

Y finalmente instalaremos la versión de Certbot para nginx con apt-get:

sudo apt-get install python-certbot-nginx

Después de haber seguido estos pasos podremos hacer uso de Certbot, pero para poder configurar SSL en nginx, debemos realizar primero algunas verificaciones en nginx.

Paso 2 – Configurar nginx

Ahora es posible que Certbot pueda configurar SSL para nginx de manera automática, sin embargo necesita poder encontrar primero el bloque server antes de poder hacerlo. nginx hace esto buscando la directiva server_name, la cuál debe coincidir con el dominio al que estamos solicitando el certificado.

Si estás en una instalación limpia de nginx puedes modificar el archivo de configuración default de nginx. Abre el archivo con nano o tu editor favorito:

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

Busca la línea que inicie con la directiva server_name y cambia el _ por tu nombre de dominio:

...
server_name ejemplo.com www.ejemplo.com
...

Guarda los cambios y cierra el editor y después verifica la configuración de nginx con el siguiente comando:

sudo nginx -t

Si recibes algún error vuelve a modificar tu archivo de configuración y corrige los errores que puedas tener.

Una vez que no te muestre errores reinicia la configuración de nginx:

sudo systemctl reload nginx

Con esto Certbot podrá encontrar el bloque server adecuado para poder actualizarlo. Después vamos a actualizar la configuración del firewall para permitir el tráfico HTTPS.

Paso 3 – Permitir el paso de HTTPS a través del Firewall

Si tienes ufw habilitado como lo recomendamos en la configuración inicial de Ubuntu 16.04, deberás ajustar las configuraciones para permitir el tráfico HTTPS. Afortunadamente, nginx registra algunos perfiles al momento de hacer su instalación.

Para verificar el estado actual ejecuta el siguiente comando en la terminal:

sudo ufw status

Deberás ver algo como lo siguiente:

# Output de la terminal

Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)

Para permitir el tráfico HTTPS deberás habilitar el perfil Nginx Full y deshabilitar el perfil Nginx HTTP para no tener redundancia en las reglas del firewall:

sudo ufw allow 'Nginx Full'
sudo ufw delete 'Nginx HTTP'

Revisa ahora el estatus del firewall:

sudo ufw status

Deberás ver algo como esto:

# Output de la terminal

Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)

Ahora todo está preparado y listo para que Certbot pueda obtener nuestros certificados.

Paso 4 – Obtener un certificado SSL

Certbot proporciona una variedad de formas en las que podemos obtener certificados SSL, a través de diferentes plugins. El plugin de nginx se encargará de reconfigurar nginx y reiniciar la configuración cuando sea necesario:

sudo certbot --nginx -d ejemplo.com -d www.ejemplo.com

Esto va a ejecutar Certbot con el plugin de nginx. El parámetro -d nos sirve para indicar los nombres para los cuales queremos que sea válido el certificado.

Si es la primera vez que ejecutamos Certbot, se nos va a pedir que indiquemos una dirección de correo electrónico para aceptar los términos de servicio. Después de aceptarlos, Certbot se va a comunicar con el servidor de Let’s Encrypt, luego hará una verificación para confirmar que efectivamente controlamos el dominio al que estamos solicitando el certificado.

Si todo es correcto, Certbot nos va a preguntar cómo queremos establecer las configuraciones HTTPS.

# Output de la terminal

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-----------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration.
-----------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Selecciona la opcion que necesites y presiona ENTER. La configuración se actualizará automáticamente y nginx se reiniciará para aplicar las nuevas configuraciones. Certbot mostrará después un mensaje indicando que el proceso ha concluido exitosamente y te dirá dónde se encuentran los certificados.

# Output de la terminal

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-10-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again with the
"certonly" option. To non-interactively renew *all* of your
certificates, run "certbot renew"
- 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

Los certificados ahora han sido descargados, instalados y aplicados. Si ahora refrescamos la página web en el navegador podrás ver el indicador de seguridad. Esto indicará que nuestro sitio ha sido asegurado correctamente, usualmente con el logotipo de un candado en color verde a un lado de la URL.

Por último, vamos a revisar el proceso de renovación.

Paso 5 – Verificar la auto-renovación de Certbot

Los certificados de Let’s Encrypt son válidos solamente por 90 días. Esto lo manejan así para alentar a los usuarios de este servicio a automatizar el proceso de renovación de certificados. El paquete de Certbot que instalamos, toma cartas en el asunto por nosotros ejecutando el comando certbot renew dos veces al día en una tarea programada. Esto renovará los certificados con 30 días de anticipación antes de vencer el certificado.

Para probar el proceso de renovación, puedes ejecutar un dry run con Certbot:

sudo certbot renew --dry-run

Si no ves ningún error, todo se encuentra bien. Si el proceso llegara a fallar, Certbot va a enviar un correo a la dirección especificada al momento de empezar a utilizar Certbot, indicando que uno de tus certificados está a punto de expirar.

Recuerda que puedes seguirnos en Twitter y suscribirte a nuestro boletín:

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.