Instalar un certificado SSL gratis con Let's Encrypt y Certbot

Publicado el Actualizado el 5 min de lectura

Certificado SSL gratuito para tu servidor Linux: así instalas Certbot en Debian y Ubuntu, emites un certificado de Let's Encrypt para Apache y dejas que se renueve solo.

Un certificado SSL de Let's Encrypt no cuesta nada, se configura en pocos minutos y lo aceptan todos los navegadores habituales. En esta guía activas HTTPS en tu propio servidor Linux con Apache: en Debian 13, Debian 12, Ubuntu 24.04 LTS y Ubuntu 22.04 LTS.

De la emisión se encarga Certbot, el cliente ACME oficial de la Electronic Frontier Foundation. Certbot solicita el certificado, lo inscribe en la configuración de Apache y después lo renueva por su cuenta mediante un timer de systemd.

Requisitos

  • Un dominio cuyo registro A (y también el registro AAAA si usas IPv6) apunte a tu VPS o a tu servidor root.
  • Un servidor web Apache2 en funcionamiento, con un VirtualHost para ese dominio.
  • Acceso root por SSH.
  • El puerto 80 y el puerto 443 tienen que ser accesibles desde fuera. Let's Encrypt valida el dominio a través del puerto 80.

Comprueba primero si el dominio apunta realmente a tu servidor. Para ello, introduce tu dominio en https://check-host.net/. Si ahí aparece la dirección IP de tu servidor, puedes continuar. Si el DNS todavía apunta a un destino antiguo, espera a que se propague la actualización, porque de lo contrario la emisión falla.

Actualizar el sistema

Pon primero al día la lista de paquetes y los paquetes instalados:

apt update && apt upgrade -y

Instalar Certbot

Hay dos vías habituales. El paquete de la distribución es el camino más sencillo y resulta más que suficiente para la mayoría de servidores. El paquete snap trae siempre la versión más reciente de Certbot y es el que recomienda oficialmente la Electronic Frontier Foundation.

Variante 1: Certbot desde el repositorio de la distribución

En Debian y Ubuntu, Certbot y el plugin de Apache están directamente en los repositorios de paquetes:

apt install certbot python3-certbot-apache -y

El paquete "python-certbot-apache", muy extendido en su día, pertenecía a Python 2 y ya no existe. En todas las versiones actuales de Debian y Ubuntu, el nombre de paquete correcto es "python3-certbot-apache".

Variante 2: instalar Certbot mediante snap

Si quieres disponer siempre de la versión más reciente de Certbot, por ejemplo para plugins DNS o certificados wildcard, instala Certbot como snap. Elimina antes una posible instalación por paquete, para que las dos no se estorben:

apt remove certbot -y
snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

Emitir el certificado e integrarlo en Apache

La vía más rápida es el plugin de Apache. Certbot lee los VirtualHosts existentes, solicita el certificado y escribe él mismo la configuración SSL adecuada:

certbot --apache -d MiDominio.com -d www.MiDominio.com

Si prefieres controlar tú mismo la configuración de Apache, puedes hacer que la validación del dominio pase por el directorio webroot. Indica entonces exactamente el directorio que el VirtualHost usa como DocumentRoot:

certbot --authenticator webroot --installer apache -w /var/www/MiDominio.com -d MiDominio.com -d www.MiDominio.com

Si tu página web está en el directorio predeterminado, el comando es:

certbot --authenticator webroot --installer apache -w /var/www/html/ -d MiDominio.com -d www.MiDominio.com

Las preguntas de Certbot

En la primera ejecución, Certbot hace algunas preguntas:

  • Dirección de correo electrónico: indica una dirección que leas de verdad. Let's Encrypt la usa para avisarte cuando una renovación no llega a producirse.
  • Condiciones de uso: con "A" las aceptas.
  • Boletín de la Electronic Frontier Foundation: "Y" para sí, "N" para no. Es voluntario y no influye en el certificado.
  • Redirección a HTTPS: elige la opción "Redirect" para que Apache envíe automáticamente todas las peticiones HTTP a HTTPS.

Después, Certbot muestra la ruta del certificado. Los archivos están en /etc/letsencrypt/live/MiDominio.com/. No edites esos archivos a mano, se reescriben en cada renovación.

Comprobar la renovación automática

Un certificado de Let's Encrypt tiene una validez de 90 días. Certbot lo renueva automáticamente en cuanto quedan menos de 30 días de vigencia. Para eso, el paquete incluye un timer de systemd. Comprueba si está activo:

systemctl list-timers certbot.timer

Si el timer no está activo, actívalo:

systemctl enable --now certbot.timer

Prueba después el proceso en seco. Así no se emite nada, Certbot solo simula la renovación:

certbot renew --dry-run

Para que Apache utilice realmente el certificado nuevo tras una renovación, registra una sola vez un deploy hook:

certbot renew --deploy-hook "systemctl reload apache2"

Mostrar y eliminar certificados

Para obtener una visión general de todos los certificados gestionados en el servidor:

certbot certificates

Un certificado que ya no necesites lo eliminas así, para que Certbot no siga intentando renovarlo:

certbot delete --cert-name MiDominio.com

Errores frecuentes

  • "Could not bind to port 80": otro servicio ocupa el puerto 80. Detenlo o usa el método webroot, que trabaja con el Apache que ya está en marcha.
  • "Invalid response from http://.../.well-known/acme-challenge/...": el dominio no apunta a este servidor, un firewall bloquea el puerto 80, o el directorio webroot indicado no coincide con el VirtualHost.
  • "The requested apache plugin does not appear to be installed": falta el paquete "python3-certbot-apache".
  • "too many certificates already issued": has alcanzado un límite de Let's Encrypt. A partir de ahora, prueba las configuraciones con --dry-run antes de solicitar un certificado real.
  • El navegador sigue mostrando un aviso: vacía la caché del navegador y comprueba si Apache se recargó después de la emisión.

Redirigir HTTP a HTTPS de forma permanente

Si no activaste la redirección cuando Certbot te lo preguntó, puedes añadirla en cualquier momento. Cómo funciona eso con un archivo .htaccess lo describimos en un artículo aparte sobre la redirección de HTTP a HTTPS.

Preguntas frecuentes

¿Cuánto cuesta un certificado SSL de Let's Encrypt?
Nada. Let's Encrypt es una autoridad de certificación sin fines de lucro y emite los certificados de forma gratuita. No hay cuotas únicas ni cuotas periódicas.
¿Cuánto tiempo es válido un certificado de Let's Encrypt?
90 días. Certbot lo renueva automáticamente en cuanto quedan menos de 30 días de vigencia. El timer de systemd que se encarga de ello se configura durante la instalación.
¿Tengo que renovar el certificado a mano?
No. Comprueba una sola vez con certbot renew --dry-run que la renovación se ejecuta sin problemas. A partir de ahí, Certbot se ocupa por su cuenta en segundo plano.
¿Let's Encrypt funciona también para subdominios?
Sí. Los demás nombres los añades al comando con parámetros -d adicionales. Un certificado wildcard exige además una validación mediante un registro DNS y, por tanto, un plugin DNS adecuado para Certbot.
¿Por qué falla la validación del dominio?
En casi todos los casos, el registro A del dominio no apunta a este servidor o un firewall bloquea el puerto 80. Let's Encrypt no llega entonces al servidor e interrumpe la emisión.

Lets-Encrypt Certbot Certificado SSL HTTPS Apache Debian Ubuntu