SSLmentor

Certificados TLS/SSL de calidad para sitios web y proyectos en Internet.

Certbot

Certbot

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.

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ón

Creació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 configtest devuelve Syntax OK.
  • curl -I http://example.com responde por HTTP.
  • curl -I https://example.com responde por HTTPS.
  • certbot certificates muestra el certificado esperado.
  • certbot renew --dry-run se completa sin error.
  • systemctl list-timers | grep certbot muestra un certbot.timer activo.

Volver a Ayuda
¿Encontraste un error o no entiendes algo? ¡Escríbenos!

CA Sectigo
CA RapidSSL
CA Thawte
CA GeoTrust
CA DigiCert
CA Certum