Introducción
Let’s Encrypt es una Autoridad de certificación (CA) que proporciona una manera fácil de obtener e instalar certificados TLS/SSL gratuitos. Esto permite HTTPS cifrado en servidores web.
Simplifica el proceso al proporcionar un cliente de software, Certbot, que intenta automatizar la mayoría (si no todos) de los pasos requeridos. Actualmente, todo el proceso de obtención e instalación de un certificado está totalmente automatizado tanto en Apache como en Nginx.
En este tutorial, utilizarás Certbot para obtener un certificado SSL gratuito para Nginx en Ubuntu 20.04 y configurarás tu certificado para que se renueve automáticamente.
Este tutorial utilizará un archivo de configuración del servidor Nginx separado en lugar del archivo predeterminado. Recomendamos crear nuevos archivos de bloque del servidor Nginx para cada dominio porque ayuda a evitar errores comunes. También porque mantiene los archivos predeterminados como una configuración alternativa.
Prerrequisitos
Para seguir este tutorial, necesitará:
- Un servidor Ubuntu 20.04 configurado siguiendo este tutorial de configuración básica de servidores con Ubuntu 20.04. Este incluye un usuario no root habilitado para sudo y un firewall.
- Un nombre de dominio registrado. Este tutorial se usará example.com en todo momento. Puedes comprar un nombre de dominio de Namecheap, obtener uno gratis con Freenom o usar el registrador de dominio que prefieras.
- Los 2 siguientes registros DNS configurados para tu servidor. Puedes consultar este artículo sobre documentación de DNS para obtener detalles sobre cómo agregarlos.
- Un registro A con example.com que apunta a la dirección IP pública de tu servidor.
- Un registro A con www.example.com que apunta a la dirección IP pública de tu servidor.
- Nginx se instala siguiendo la guía de Cómo instalar Nginx en Ubuntu 20.04. Asegúrate de tener un bloque de servidor para tu dominio. Este tutorial lo usarás como ejemplo ./etc/nginx/sites-available/example.com.
Paso 1 – Instalación de Certbot
El primer paso para usar Let’s Encrypt para obtener un certificado SSL es instalar el software Certbot en tu servidor.
Debes instalar Certbot y tu complemento Nginx con apt:
1 |
$ sudo apt install certbot python3-certbot-nginx |
Certbot ahora está listo para usarse, pero para que puedas configurar automáticamente SSL para Nginx, necesitamos verificar algunas de las configuraciones de Nginx.
Paso 2 – Confirmación de la configuración de Nginx
Certbot necesita poder encontrar el bloque server correcto en tu configuración de Nginx para poder configurar automáticamente SSL. Específicamente, lo haces buscando una directiva server_name que coincida con el dominio para el que solicita un certificado.
Si seguiste el paso de configuración del bloque del servidor en el tutorial de instalación de Nginx, deberías tener un bloque del servidor para tu dominio en /etc/nginx/sites-available/example.com con la directiva server_name ya configurada adecuadamente.
Para verificar, debes abrir el archivo de configuración para tu dominio usando nano o tu editor de texto favorito:
1 |
$ sudo nano /etc/nginx/sites-available/example.com |
Debes encontrar la línea existente server_name. Debe tener un aspecto como este:
1 2 3 4 |
/etc/nginx/sites-available/example.com ... server_name example.com www.example.com; ... |
Si es así, debes salir de tu editor y continuar con el siguiente paso.
Si no es así, actualízalo para que coincida. Luego guarda el archivo, sal de tu editor y verifica la sintaxis de tus ediciones de configuración:
1 |
$ sudo nginx -t |
Si obtienes un error, vuelve a abrir el archivo de bloque del servidor y verifica si hay errores tipográficos o faltan caracteres. Una vez que la sintaxis del archivo de configuración sea correcta, vuelve a cargar Nginx para cargar la nueva configuración:
1 |
$ sudo systemctl reload nginx |
Certbot ahora puede encontrar el bloque server correcto y actualizarlo automáticamente.
A continuación, debes actualizar el firewall para permitir el tráfico HTTPS.
Paso 3 – Permitir HTTPS a través del firewall
Si tienes habilitado el firewall ufw, como recomiendan las guías de requisitos previos, deberás ajustar la configuración para permitir el tráfico HTTPS. Afortunadamente, Nginx registra algunos perfiles con ufw durante la instalación.
Puedes ver la configuración actual escribiendo:
1 |
$ sudo ufw status |
Probablemente se verá así, lo que significa que solo se permite el tráfico HTTP al servidor web:
1 2 3 4 5 6 7 8 9 |
Output 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 adicionalmente el tráfico HTTPS, debes permitir el perfil completo de Nginx y eliminar la asignación redundante de perfil HTTP Nginx:
1 2 |
$ sudo ufw allow 'Nginx Full' $ sudo ufw delete allow 'Nginx HTTP' |
Tu estado ahora debería verse así:
1 2 3 4 5 6 7 8 9 10 11 |
$ sudo ufw status Output Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6) |
Paso 4 – Obtención de un certificado SSL
Certbot proporciona una variedad de formas de obtener certificados SSL a través de complementos. El complemento Nginx se encargará de reconfigurar Nginx y volver a cargar la configuración siempre que sea necesario. Para usar este complemento, escribe lo siguiente:
1 |
$ sudo certbot --nginx -d example.com -d www.example.com |
Esto ejecuta certbot con el complemento –nginx y usa –d para especificar los nombres de dominio para los que nos gustaría que el certificado sea válido.
Si es la primera vez que se ejecutas certbot, se te pedirá que ingreses una dirección de correo electrónico y aceptes los términos del servicio. Después de hacerlo, certbot se comunicará con el servidor Let’s Encrypt. Luego ejecutará un desafío para verificar que controles el dominio para el que solicitas un certificado.
Si tiene éxito, certbot te preguntará cómo te gustaría configurar tus ajustes HTTPS.
1 2 3 4 5 6 7 8 9 |
Output 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 tu elección y luego presiona ENTER. La configuración se actualizará y Nginx se volverá a cargar para elegir la nueva configuración. certbot finalizará con un mensaje que te indicará que el proceso fue exitoso y dónde se almacenan tus certificados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Output IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. 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" - 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 |
Tus certificados se descargan, instalan y cargan. Intenta volver a cargar tu sitio web utilizando https:// y observa el indicador de seguridad de tu navegador. Debe indicar que el sitio está asegurado correctamente, generalmente con un ícono de candado. Si pruebas tu servidor usando la SSL Labs Server Test, obtendrás una calificación A.
Terminemos probando el proceso de renovación.
Paso 5 – Verificación de la renovación automática de Certbot
Los certificados de Let’s Encrypt solo son válidos por noventa días. Esto es para alentar a los usuarios a automatizar su proceso de renovación de certificados. El paquete certbot que instalamos se encarga de esto al agregar un temporizador systemd. Este se ejecutará dos veces al día y renovará automáticamente cualquier certificado dentro de los treinta días posteriores al vencimiento.
Puedes consultar el estado del temporizador con systemctl:
1 2 3 4 5 6 7 8 |
$ sudo systemctl status certbot.timer Output ● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service |
Para probar el proceso de renovación, puedes hacer una ejecución con dry en certbot:
1 |
$ sudo certbot renew --dry-run |
Si no ves errores, ya está todo listo. Cuando sea necesario, Certbot renovará tus certificados y volverá a cargar Nginx para aplicar los cambios.
Si el proceso de renovación automática falla alguna vez, Let’s Encrypt enviará un mensaje al correo electrónico que especificaste, advirtiéndote cuando tu certificado esté por vencer.
Conclusión
En este tutorial, instalaste el cliente certbot de Let’s Encrypt, descargaste certificados SSL para tu dominio y configuraste Nginx para usar estos certificados. También configuraste la renovación automática de certificados. Si tienes más preguntas sobre el uso de Certbot, la documentación oficial es un buen lugar para comenzar.