Introducción
Let’s Encrypt es una Autoridad de Certificación (CA) que proporciona una manera accesible de obtener e instalar certificados TLS/SSL gratuitos, lo que permite habilitar HTTPS en servidores web de forma encriptada. 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á completamente automatizado tanto en Apache como en Nginx.
En este tutorial, utilizarás Certbot para obtener un certificado SSL gratuito para Nginx en Rocky Linux 9 y configurar tu certificado para que se renueve automáticamente.
Este tutorial utilizará un archivo de configuración de servidor Nginx separado en lugar del archivo predeterminado. Deberías crear nuevos archivos de bloque de servidor Nginx para cada dominio, ya que esto ayuda a evitar errores comunes y mantiene los archivos predeterminados como una configuración de respaldo.
Prerrequisitos
Para seguir este tutorial, necesitarás:
-
Un servidor Rocky Linux 9 configurado siguiendo este tutorial de configuración inicial del servidor para Rocky Linux 9, que incluye un usuario no root habilitado para sudo y un firewall.
-
Un nombre de dominio registrado. Este tutorial usará
example.com
en todo momento. Puedes comprar un nombre de dominio en Namecheap, obtener uno gratis con Freenom, o usar el registrador de dominios de tu elección. -
Ambos registros DNS siguientes configurados para tu servidor. Si estás usando DigitalOcean, por favor consulta nuestra documentación de DNS para más detalles sobre cómo añadirlos.
- Un registro A con
example.com
apuntando a la dirección IP pública de tu servidor. - Un registro A con
www.example.com
apuntando a la dirección IP pública de tu servidor.
- Un registro A con
-
Nginx instalado siguiendo Cómo instalar Nginx en Rocky Linux 9. Asegúrate de tener un bloque de servidor para tu dominio. Este tutorial usará
/etc/nginx/sites-available/example.com
como ejemplo.
Paso 1 — Instalar Certbot
Primero, necesitas instalar el paquete de software certbot
. Inicia sesión en tu máquina Rocky Linux 8 como usuario no root:
- ssh sammy@your_server_ip
El paquete certbot
no está disponible a través del gestor de paquetes por defecto. Debes habilitar el repositorio EPEL para instalar Certbot.
Para agregar el repositorio EPEL de Rocky Linux 9, ejecuta el siguiente comando:
- sudo dnf install epel-release
Cuando se te pida confirmar la instalación, escribe y presiona y
.
Ahora que tienes acceso al repositorio adicional, instala todos los paquetes requeridos:
- sudo dnf install certbot python3-certbot-nginx
Esto instalará Certbot en sí y el complemento Nginx para Certbot, que es necesario para ejecutar el programa.
El proceso de instalación te pedirá que importes una clave GPG. Confírmalo para que la instalación pueda completarse.
Ahora que tienes Certbot instalado, ejecutémoslo para obtener un certificado.
Paso 2 — Confirmar 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, hace esto buscando una directiva server_name
que coincida con el dominio para el cual solicitas un certificado.
Si seguiste el paso de configuración del bloque de servidor en el tutorial de instalación de Nginx, deberías tener un bloque de servidor para tu dominio en /etc/nginx/conf.d/example.com
con la directiva server_name
ya establecida adecuadamente.
Para verificar, abre el archivo de configuración para tu dominio usando nano
o tu editor de texto favorito:
- sudo nano /etc/nginx/conf.d/example.com
Encuentra la línea existente de server_name
. Debería lucir así:
...
server_name example.com www.example.com;
...
Si lo hace, sal de tu editor y continúa con el siguiente paso.
Si no lo hace, actualízalo para que coincida. Luego guarda el archivo, cierra tu editor y verifica la sintaxis de tus ediciones de configuración.
- sudo nginx -t
Si obtienes un error, vuelve a abrir el archivo del bloque del servidor y verifica cualquier error tipográfico o caracteres faltantes. Una vez que la sintaxis de tu archivo de configuración sea correcta, recarga Nginx para cargar la nueva configuración:
- sudo systemctl reload nginx
Certbot ahora puede encontrar el bloque server
correcto y actualizarlo automáticamente.
A continuación, actualicemos el firewall para permitir el tráfico HTTPS.
Paso 3 — Actualización de las Reglas del Firewall
Dado que tu configuración previa habilita firewalld
, deberás ajustar la configuración del firewall para permitir conexiones externas en tu servidor web Nginx.
Para verificar qué servicios ya están habilitados, ejecuta el siguiente comando:
- sudo firewall-cmd --permanent --list-all
Recibirás una salida como esta:
Outputpublic
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Si no ves http
en la lista de servicios, habilítalo ejecutando:
- sudo firewall-cmd --permanent --add-service=http
Para permitir el tráfico https
, ejecuta el siguiente comando:
- sudo firewall-cmd --permanent --add-service=https
Para aplicar los cambios, necesitarás recargar el servicio de firewall:
- sudo firewall-cmd --reload
Ahora que has abierto tu servidor al tráfico https, estás listo para ejecutar Certbot y obtener tus certificados.
Paso 4 — Obtención de un Certificado SSL
Certbot ofrece una variedad de formas de obtener certificados SSL a través de complementos. El complemento de Nginx se encargará de reconfigurar Nginx y recargar la configuración cuando sea necesario. Para usar este complemento, escriba lo siguiente:
- sudo certbot --nginx -d example.com -d www.example.com
Esto ejecuta certbot
con el complemento --nginx
, usando -d
para especificar los nombres de dominio para los que necesita que el certificado sea válido.
Al ejecutar el comando, se le pedirá que ingrese una dirección de correo electrónico y que acepte los términos del servicio. Después de hacerlo, debería ver un mensaje que le indique que el proceso fue exitoso y dónde se almacenan sus certificados:
OutputSuccessfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-12-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf
Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf
Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain
…
Sus certificados se descargan, instalan y cargan, y la configuración de su Nginx ahora redireccionará automáticamente todas las solicitudes web a https://
. Pruebe a recargar su sitio web y observe el indicador de seguridad de su navegador. Debería indicar que el sitio está correctamente protegido, generalmente con un ícono de candado. Si prueba su servidor utilizando la Prueba del Servidor SSL de SSL Labs, obtendrá una calificación A.
Terminemos probando el proceso de renovación.
Paso 5 — Verificando la Renovación Automática de Certbot
Los certificados de Let’s Encrypt son válidos por 90 días, pero se recomienda renovar los certificados cada 60 días para permitir un margen de error. El cliente de Let’s Encrypt Certbot tiene un comando renew
que verifica automáticamente los certificados instalados actualmente e intenta renovarlos si están a menos de 30 días de la fecha de vencimiento.
Puedes probar la renovación automática de tus certificados ejecutando este comando:
- sudo certbot renew --dry-run
La salida será similar a esta:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your_domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for monitoring.pp.ua
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/your_domain/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/your_domain/fullchain.pem (success)
...
Nota que si creaste un certificado agrupado con múltiples dominios, solo se mostrará el nombre de dominio base en la salida, pero la renovación funcionará para todos los dominios incluidos en este certificado.
A practical way to ensure your certificates will not get outdated is to create a cron
job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.
Edita el crontab para crear un nuevo trabajo que se ejecute dos veces al día. Para editar el crontab del usuario root, ejecuta:
- sudo crontab -e
Tu editor de texto abrirá el crontab predeterminado, que es un archivo de texto vacío en este punto. Entra en el modo de inserción presionando i
y agrega la siguiente línea:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
Cuando hayas terminado, presiona ESC
para salir del modo de inserción, luego :wq
y ENTER
para guardar y salir del archivo. Para aprender más sobre el editor de texto Vi y su sucesor Vim, consulta nuestro tutorial Instalación y Uso del Editor de Texto Vim en un Servidor en la Nube.
Esto creará un nuevo trabajo cron que se ejecutará al mediodía y a la medianoche todos los días. python -c 'import random; import time; time.sleep(random.random() * 3600)'
seleccionará un minuto aleatorio dentro de la hora para tus tareas de renovación.
El comando renew
para Certbot verificará todos los certificados instalados en el sistema y actualizará aquellos que estén configurados para expirar en menos de treinta días. --quiet
indica a Certbot que no debe mostrar información ni esperar la entrada del usuario.
Se puede encontrar información más detallada sobre la renovación en la documentación de Certbot.
Conclusión
En esta guía, instalaste el cliente Let’s Encrypt Certbot, descargaste certificados SSL para tu dominio y configuraste la renovación automática del certificado. Si tienes preguntas sobre cómo usar Certbot, puedes consultar la documentación oficial de Certbot.
También puedes revisar el blog oficial de Let’s Encrypt para obtener actualizaciones importantes de vez en cuando.