Cómo gestionar los certificados SSL/TLS de Let’s Encrypt con certbot
Let’s Encrypt es una autoridad de certificación (CA) automatizada y abierta, gestionada por el Grupo de Investigación sobre Seguridad en Internet (ISRG) y fundada por la Electronic Frontier Foundation (EFF), la Fundación Mozilla y otros. Proporciona certificados SSL/TLS gratuitos que se utilizan habitualmente para cifrar comunicaciones con fines de seguridad y privacidad, siendo el caso de uso más notable el HTTPS. Let’s Encrypt se basa en el protocolo ACME (Automatic Certificate Management Environment) para emitir, revocar y renovar certificados. Certbot es una utilidad gratuita y de código abierto que se utiliza principalmente para gestionar certificados SSL/TLS de la autoridad de certificación Let’s Encrypt. Está disponible para la mayoría de los sistemas operativos UNIX y similares a UNIX, incluidos GNU/Linux, FreeBSD, OpenBSD y OS X. Esta guía proporcionará una introducción agnóstica a la plataforma para el uso de certbot.
NOTA: Dado que certbot es un trabajo en curso, algunas funciones o comportamientos descritos en esta guía podrían diferir en versiones anteriores o futuras.
Requisitos
- Un nombre de dominio registrado con un registro A que apunte a tu dirección IPv4. Se utilizará `www.example.com` como ejemplo.
- Acceso a un shell privilegiado.
Conceptos Generales
Modos de funcionamiento
El uso de certbot para habilitar HTTPS puede dividirse en dos partes: Autenticación e Instalación. La primera requiere resolver un desafío y guardar el certificado y otros archivos. El paso de instalación implica configurar y asegurar el servidor web. Certbot puede realizar ambos automáticamente, con el subcomando ejecutar. Los subcomandos certonly e install son para los pasos de autenticación e instalación respectivamente.
Certbot también incluye funciones de renovación y revocación de certificados.
Desafíos
Obtener un certificado Let’s Encrypt implica resolver un desafío de validación de dominio emitido por un servidor ACME (Entorno de Gestión Automática de Certificados). Este desafío verifica tu propiedad del dominio o dominios para los que intentas obtener un certificado. Existen diferentes tipos de desafío, el más utilizado es el HTTP-01. Como su nombre indica, utiliza el protocolo HTTP. Aunque los servidores HTTP pueden configurarse para utilizar cualquier puerto TCP, este desafío sólo funcionará en el puerto 80 debido a las medidas de seguridad. DNS-01 es otro tipo de impugnación menos popular basado en la resolución DNS. Ten en cuenta que los certificados comodín no se pueden obtener mediante la impugnación HTTP-01. Esta guía se centrará inicialmente en HTTP-01.
Plugins
Certbot se basa en plugins para realizar la autenticación y la instalación. Plugins como webroot y standalone sólo realizan la autenticación, mientras que otros como los plugins de Apache y Nginx están diseñados para obtener e instalar certificados automáticamente (es decir, la configuración del servidor web). Otros plugins incluyen varios plugins DNS específicos del proveedor para la autenticación DNS-01. La mayoría de los plugins de certbot se instalan por separado, excepto los plugins webroot y standalone, que están incorporados.
Instalar Certbot
La mayoría de las distribuciones de Linux proporcionan certbot en sus repositorios oficiales. A continuación encontrarás las instrucciones de instalación para las plataformas más utilizadas.
Debian y Ubuntu:
apt update
apt install -y certbot
CentOS 7:
yum install -y certbot
Fedora y CentOS 8:
dnf install -y certbot
Arch Linux:
pacman -Sy certbot
FreeBSD:
pkg install py36-certbot
OpenBSD 6.0 y posteriores:
pkg_add certbot
brew install letsencrypt
Otros:
Si no hay un paquete certbot disponible para tu plataforma, puedes utilizar el script oficial certbot-auto wrapper para instalar certbot automáticamente en tu sistema. Puedes descargarlo aquí.
Utilizar Certbot
Listado de certificados
Para mostrar una lista de los certificados gestionados por certbot en tu servidor, emite el comando:
certbot certificates
Obtener un certificado para la configuración manual
Si decides configurar manualmente tu servidor web, puedes obtener un certificado de dos formas. O bien dando acceso a certbot al directorio raíz web de tu servidor (es decir, el complemento webroot), o bien desplegando un servidor web autónomo temporal en el puerto 80 (es decir, el complemento autónomo). Este último plugin es útil en los casos en que la integración con tu servidor web existente es imposible o no se desea. Para mayor comodidad y simplificar las renovaciones, sé coherente con el plugin utilizado.
Utilizar un servidor web existente
Para utilizar tu servidor web existente, asegúrate de que está funcionando y escuchando en el puerto 80 antes de ejecutar el siguiente comando
certbot certonly --webroot
Se te pedirá que introduzcas, entre otra información, tu(s) nombre(s) de dominio y la ruta a tu raíz web, que es `/var/www/html/` por defecto en la mayoría de los sistemas Linux. Alternativamente, puedes especificar la información requerida como argumentos del comando. Por ejemplo:
certbot certonly --webroot --webroot-path /var/www/html --agree-tos -m [email protected] -d www.example.com
Utilizar el servidor web autónomo
Para utilizar el servidor autónomo, asegúrate primero de la disponibilidad del puerto 80. Puedes comprobar si hay algún proceso vinculado a ese puerto utilizando:
ss -lntp 'sport = 80'
Si es necesario, detén el servicio/proceso infractor antes de continuar. A continuación, emite el comando:
certbot certonly --standalone
Una vez emitido el certificado, tendrás que configurar manualmente tu servidor web. Los archivos correspondientes se encuentran en /etc/letsencrypt/live/your_domain.
Instalación interactiva HTTPS
Como se ha mencionado anteriormente, certbot puede automatizar todo el proceso de instalación HTTPS, incluida la configuración del servidor web. Hay plugins disponibles tanto para Apache como para Nginx, y puede ser necesario instalarlos como un paquete independiente. Instala el plugin de certbot específico para tu servidor web, y luego ejecuta `certbot run –PLUGIN_NAME`. Demostraremos todo el proceso para Apache en un sistema Debian 10. El proceso para Nginx es similar.
apt install -y python-certbot-apache certbot run --apache
Suponiendo que tu servidor web ya esté configurado para tu(s) nombre(s) de dominio, certbot analizará la configuración existente y te pedirá que elijas para qué nombre(s) de dominio debe activarse HTTPS. Si tu servidor web no está configurado, o si certbot no detecta tu(s) nombre(s) de dominio, simplemente introduce tu(s) nombre(s) de dominio manualmente cuando se te solicite. Por ejemplo:
Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: www.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 1
Certbot creará un nuevo archivo de configuración de Apache para tu nuevo host virtual HTTPS, y te preguntará si el tráfico HTTP debe redirigirse a HTTPS. A menos que tengas razones de peso para no hacerlo, deberías activar la redirección a HTTPS.
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): 2 Enabled Apache rewrite module Redirecting vhost in /etc/apache2/sites-enabled/www.example.com.conf to ssl vhost in /etc/apache2/sites-available/www.example.com-le-ssl.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://www.example.com
Renovar certificados
Renovación manual
Para renovar tus certificados con certbot, puedes utilizar el subcomando renovar. Durante la renovación, certbot utilizará los mismos plugins y opciones utilizados para la emisión original. Los certificados sólo se renuevan si caducan en menos de 30 días, por lo que este subcomando puede utilizarse con la frecuencia que se desee, ya que no realizará ninguna acción si los certificados no están cerca de su fecha de caducidad. El comando es simple:
certbot renew
Si se utilizó el complemento autónomo para emitir un certificado, tendrás que detener tu servidor web para que la renovación se realice correctamente. Puedes conseguirlo utilizando ganchos. Por ejemplo, si el sistema ejecuta Apache, el comando sería
certbot renew --pre-hook "systemctl stop apache2.service" --post-hook "systemctl start apache2.service"
Renovación automática
Muchas distribuciones tienen activadas las renovaciones automáticas por defecto, ya sea mediante temporizadores systemd o trabajos cron. Puedes comprobar los temporizadores de systemd con:
systemctl list-timers
Y para las tareas cron con:
ls /etc/cron*
Si se utilizó el complemento webroot para la emisión, las renovaciones automáticas deberían tener éxito siempre que tu servidor web esté en funcionamiento. Sin embargo, con el complemento independiente, el comando de renovación automática por defecto fallará en caso de que se esté ejecutando un servidor web, ya que certbot no podrá enlazarse al puerto 80. Por lo tanto, es necesario modificarlo añadiendo ganchos, como se muestra más arriba.
Revocar certificados
Se puede revocar un certificado especificando la ruta o el nombre del certificado:
certbot revoke --cert-name cert_name (OR) certbot revoke --cert-path /path/to/cert.pem
Por ejemplo:
certbot revoke --cert-name www.example.net
Tras ejecutar el subcomando revocar, certbot preguntará si deben borrarse los archivos de certificado. Si decides no borrarlos, el certificado revocado se renovará en la siguiente renovación. Se pueden pasar varias opciones autoexplicativas al subcomando revocar:
- –delete-after-revoke (pide por defecto la elección del usuario)
- –no-eliminar-después-de-revocar (pregunta al usuario por defecto)
- –reason [unspecified,keycompromise,affiliationchanged,superseded,cessationofooperation] (Por defecto: unspecified)
Certificados comodín
Se puede utilizar un único certificado comodín para identificar varios subdominios, como alternativa a los certificados normales separados. Para obtener un certificado comodín, debe utilizarse el desafío DNS-01. Aunque existen varios plugins específicos para cada proveedor que automatizan el proceso de autenticación ACME, explicaremos el proceso manual, independiente del proveedor. Se necesita acceso a los servidores de nombres de tu dominio.
Utiliza el siguiente comando para solicitar un certificado comodín:
certbot certonly --manual --preferred-challenges dns-01 -d *.example.net
Certbot mostrará un valor que debe desplegarse en un registro DNS TXT. Este registro TXT sirve para la validación de propiedad necesaria.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.example.net with the following value: y77OkxXi89sJLjUgYu-HReYrcVlxt_bfG8yVOVKngBOcU Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue
Deberás crear el registro especificado en tu panel de control DNS antes de continuar. Una vez creado el registro, espera unos minutos antes de pulsar Intro, lo que hará que el servidor ACME lo verifique. En algunos casos, puede ser necesario un tiempo de espera más largo para que el nuevo registro se propague correctamente y sea accesible. En caso de éxito, el certificado, la cadena y la clave privada se guardarán en /etc/letsencrypt/live/example.com/.