Cliente ACME Certbot
Una guía detallada para el despliegue completo de un certificado SSL DV ACME en un VPS Debian (Apache) con renovación automática mediante el temporizador predeterminado de Certbot. La guía describe el despliegue de un certificado DV de un solo dominio o de varios dominios, por ejemplo example.com y www.example.com. Para despliegues estándar, recomendamos usar el directorio estándar de Certbot /etc/letsencrypt. De este modo, las renovaciones las gestiona el temporizador predeterminado del sistema certbot.timer.
Esta guía no cubre los certificados SSL comodín WildCard, que requieren validación DNS y una API de DNS para la renovación automática.
Contenido del artículo
- Conceptos básicos
- Apache, webroot
- Certbot, emisión del certificado
- Varios certificados en un mismo servidor
- Varias cuentas EAB
Conceptos básicos
- ACME – Protocolo para la emisión y renovación automatizadas de certificados SSL/TLS.
- Certbot – Un cliente ACME que se comunica con la autoridad de certificación y puede desplegar un certificado en Apache.
- kid + hmac – Credenciales de External Account Binding (EAB) de la autoridad de certificación. Vinculan Certbot a una cuenta o producto.
kid y hmac no verifican la propiedad del dominio, vinculan el cliente ACME a una cuenta de la CA. El dominio se verifica por separado mediante el desafío ACME. hmac es un valor sensible — no lo compartas públicamente ni lo almacenes en guías compartidas. - http-01 – Validación del dominio mediante un archivo temporal accesible en la dirección HTTP del dominio.
- dns-01 – Validación mediante un registro DNS TXT. Necesaria para los certificados comodín.
En los ejemplos, sustituye example.com por tu propio dominio.
Apache, webroot
Configuración básica de Apache y del dominio en el servidor.
›› Mostrar/Ocultar secciónCreación de un webroot separado para el dominio y una página de prueba sencilla. Apache en Debian usa por defecto el usuario www-data.
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2
| Comando | Qué hace |
|---|---|
apt update |
Actualiza la lista de paquetes desde los repositorios de Debian. |
apt install -y apache2 |
Instala el servidor web Apache. El parámetro -y confirma automáticamente la instalación. |
systemctl enable --now apache2 |
Habilita Apache al arrancar el servidor y lo inicia de inmediato. |
a2enmod rewrite headers ssl |
Habilita los módulos habituales de Apache para redirecciones, cabeceras y HTTPS. |
systemctl reload apache2 |
Recarga la configuración de Apache sin reiniciar por completo el servicio. |
Preparación del webroot
DOMAIN="example.com"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
Creación de un virtual host de Apache
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot /var/www/$DOMAIN/public
<Directory /var/www/$DOMAIN/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
Activación del sitio de Apache y comprobación HTTP
Antes de emitir el certificado, el dominio debe responder por HTTP. Esto es necesario para la validación ACME http-01.
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
curl http://$DOMAIN
Instalación de Certbot + emisión de un certificado
Instalación de Certbot desde los repositorios de Debian. El paquete python3-certbot-apache permite a Certbot modificar la configuración de Apache, realizar la validación y desplegar el certificado emitido.
apt install -y certbot python3-certbot-apache
certbot --version
Certbot es compatible con una amplia variedad de sistemas y servidores web. Recomendamos consultar las Instrucciones de Certbot para conocer el procedimiento específico del servidor web que hayas elegido.
Registro de la cuenta ACME
Para emitir un certificado, necesitas tener una cuenta ACME con la autoridad de certificación. En esta guía usaremos certificados ACME de la CA Certum.
Obtendrás las credenciales EAB (kid + hmac) en los detalles del pedido.
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
| Parámetro | Significado |
|---|---|
--server |
Especifica el endpoint ACME concreto. Sin este parámetro, Certbot usaría el servidor ACME predeterminado. CA DigiCert: https://one.digicert.com/mpki/api/v1/acme/v2/directory CA Sectigo: https://acme.sectigo.com/v2/DV |
--email |
Correo de contacto para la cuenta ACME. |
--agree-tos |
Aceptación de los términos del servicio. |
--eab-kid |
Identificador KID. |
--eab-hmac-key |
Clave secreta HMAC EAB. |
Emisión de un certificado ACME
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN \
-d www.$DOMAIN
El parámetro --cert-name es especialmente importante al gestionar varios certificados en un mismo servidor. Cada certificado individual debe tener su propio nombre único.
Verificación del certificado y renovación automática
certbot certificates
systemctl list-timers | grep certbot
certbot renew --dry-run
curl -I https://$DOMAIN
| Comando | Finalidad |
|---|---|
certbot certificates |
Muestra los certificados gestionados por Certbot. |
systemctl list-timers | grep certbot |
Verifica que el temporizador de renovación automática predeterminado esté en ejecución. |
certbot renew --dry-run |
Simula la renovación del certificado sin sustituir el certificado de producción. Salida correcta: "all simulated renewals succeeded". |
curl -I https://$DOMAIN |
Verifica la respuesta HTTPS del dominio. |
Varios certificados en un mismo servidor
Certbot puede gestionar varios certificados en el directorio estándar /etc/letsencrypt. Este modelo es el más sencillo para los despliegues de clientes porque utiliza el certbot.timer predeterminado.
- Crea un vhost de Apache independiente
Cada dominio debe tener su propio archivo en /etc/apache2/sites-available/ y su propio webroot. - Emite un certificado con un --cert-name único
No uses el mismo nombre de certificado para un certificado individual diferente. - Verifica la renovación de todos los certificados
El comando certbot renew --dry-run debe completarse correctamente para todas las entradas de /etc/letsencrypt/renewal/.
Ejemplo de comando para un dominio adicional example.net:
DOMAIN="example.net"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot /var/www/$DOMAIN/public
<Directory /var/www/$DOMAIN/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN
-d www.$DOMAIN
certbot renew --dry-run
Solución alternativa para varias cuentas EAB
En la autoridad de certificación, cada producto puede tener sus propios valores EAB. Si en el servidor ya hay registrada una cuenta ACME de la CA, otro registro para el mismo servidor ACME puede producir un error:
There is an existing account; registration of a duplicate account with this command is currently unsupported.
En tal situación, permanece en el directorio estándar /etc/letsencrypt, pero registra la nueva cuenta usando la siguiente solución alternativa. Tras la emisión, usa el --account ACCOUNT_ID concreto.
Mover temporalmente las cuentas existentes
ACME_ACCOUNT_DIR="/etc/letsencrypt/accounts/acme.certum.pl/directory"
BACKUP_DIR="/root/certbot-certum-accounts-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
find "$ACME_ACCOUNT_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$BACKUP_DIR"/ \;
Registrar una nueva cuenta EAB
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
Encontrar el ID de la nueva cuenta
ls -1 "$ACME_ACCOUNT_DIR"
La salida de este comando es el nuevo ACCOUNT_ID. Usa este valor al emitir el certificado.
Restaurar las cuentas originales
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$ACME_ACCOUNT_DIR"/ \;
Emitir un certificado mediante una cuenta concreta
certbot --apache \
--server https://acme.certum.pl/directory \
--account ACCOUNT_ID \
--cert-name example.net \
-d example.net \
-d www.example.net
| Por qué es necesaria la solución alternativa | Qué resuelve |
|---|---|
| Certbot se niega a registrar una cuenta duplicada para el mismo servidor ACME. | Mover temporalmente las cuentas permite registrar una nueva cuenta EAB. |
El directorio estándar /etc/letsencrypt debe permanecer en el servidor. |
El certbot.timer predeterminado renueva entonces todos los certificados sin un cron personalizado. |
| Cada producto de la CA puede tener su propia vinculación EAB. | El parámetro --account fuerza la cuenta de la CA correcta durante la emisión. |
Lista de verificación
apache2ctl configtestdevuelveSyntax OK.curl -I http://example.comresponde por HTTP.curl -I https://example.comresponde por HTTPS.certbot certificatesmuestra el certificado esperado.certbot renew --dry-runse completa sin error.systemctl list-timers | grep certbotmuestra uncertbot.timeractivo.
¿A dónde ir a continuación?
Volver a Ayuda
¿Encontraste un error o no entiendes algo? ¡Escríbenos!
