Linux13 de julio de 2026 14 vistas

Certbot: instalar un SSL Let's Encrypt en VPS (Nginx/Apache)

Certbot: instalar un SSL Let's Encrypt en VPS (Nginx/Apache)

Certbot: instalar un certificado SSL Let's Encrypt en su VPS Linux (Nginx & Apache)

Un sitio sin HTTPS en 2026, es un candado tachado en el navegador, una penalización SEO y visitantes que huyen. La buena noticia: en un VPS, obtener un certificado SSL/TLS válido, reconocido por todos los navegadores y 100 % gratuito toma menos de cinco minutos gracias a Certbot, el cliente oficial de Let's Encrypt. En esta guía, instalamos Certbot en Debian/Ubuntu, generamos un certificado para Nginx y Apache, configuramos la renovación automática, y revisamos los errores que encontramos con más frecuencia en soporte, incluyendo aquellos que no figuran en ninguna documentación oficial.

Let's Encrypt y Certbot: cómo funciona

Let's Encrypt es una autoridad de certificación (CA) sin fines de lucro que emite certificados SSL/TLS gratuitos a través del protocolo ACME. Certbot, desarrollado por la EFF, es el cliente ACME de referencia: se comunica con Let's Encrypt, prueba que usted controla su dominio, recupera el certificado y configura su servidor web todo en un solo comando.

La prueba de control pasa por un "desafío" (challenge). El más común, HTTP-01, consiste en depositar un archivo temporal accesible en el puerto 80 de su servidor: si Let's Encrypt puede leerlo desde el exterior, el dominio es validado y el certificado emitido. Por eso, un VPS con una IP pública dedicada es el entorno ideal, usted controla el servidor web, los puertos y el DNS de extremo a extremo.

Imagen

Particularidad a conocer: los certificados Let's Encrypt solo duran 90 días, en comparación con un año para los certificados comerciales. No es una limitación, es una elección de seguridad asumida: una clave comprometida tiene una duración de explotación corta, y la rotación fuerza la automatización. Con la renovación automática de Certbot, nunca más tendrá que pensar en ello.

Requisitos previos

Antes de ejecutar cualquier comando, verifique estos cuatro puntos, el 90 % de los fallos de emisión provienen de ahí:

  1. Un VPS Linux bajo Debian 12/13 o Ubuntu 22.04/24.04 con acceso root (o sudo).
  2. Un nombre de dominio cuyo registro DNS A (y AAAA si utiliza IPv6) apunte a la IP pública del VPS y cuya propagación haya terminado.
  3. Un servidor web instalado y que ya responda en HTTP. Si no lo ha hecho, siga primero nuestra guía instalar Nginx y PHP-FPM en un VPS.
  4. Los puertos 80 y 443 abiertos en su firewall. Bajo UFW: sudo ufw allow 'Nginx Full' (o 'WWW Full' para Apache).

¿Está en un alojamiento web compartido? Esta guía se refiere a servidores VPS. En un alojamiento cPanel, el SSL se gestiona en unos pocos clics: vea cómo crear un certificado SSL en cPanel.

Paso 1: instalar Certbot

El método recomendado por la EFF es la instalación a través de snap, que garantiza una versión siempre actualizada (el paquete apt de Debian/Ubuntu a veces tiene varias versiones de retraso, lo que causa problemas durante las evoluciones del protocolo ACME):

sudo apt update && sudo apt install snapd -y
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifique la instalación: certbot --version debe responder certbot 5.x. Si prefiere quedarse en los repositorios oficiales, sudo apt install certbot python3-certbot-nginx (o python3-certbot-apache) también funciona, simplemente asuma una versión más antigua.

Paso 2: obtener e instalar el certificado

Con Nginx

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

El plugin --nginx hace todo: validación del dominio, emisión del certificado, modificación del bloque server de su configuración, y establecimiento de la redirección HTTP → HTTPS (responda "2" cuando Certbot se lo proponga o agregue --redirect al comando para no tener la pregunta).

Imagen

Con Apache

sudo certbot --apache -d your-domain.com -d www.your-domain.com

Sin servidor web (modo standalone)

Para un servidor de correo, un panel, o cualquier aplicación que gestione el TLS por sí misma, Certbot puede levantar su propio servidor web temporal en el puerto 80:

sudo systemctl stop nginx   # liberar el puerto 80 si es necesario
sudo certbot certonly --standalone -d your-domain.com
sudo systemctl start nginx

En todos los casos, sus archivos se encuentran en /etc/letsencrypt/live/your-domain.com/: fullchain.pem (certificado + cadena intermedia, casi siempre es este el que esperan sus aplicaciones) y privkey.pem (clave privada, que nunca debe exponerse).

Paso 3: verificar la renovación automática

Este es el paso que todos saltan y la causa n°1 de los sitios que muestran "certificado expirado" tres meses después. La instalación de snap crea un temporizador systemd que ejecuta certbot renew dos veces al día; cada certificado se renueva tan pronto como entra en su ventana de los 30 últimos días de validez.


Imagen

Verifique que el temporizador esté activo, luego simule una renovación completa sin consumir su cuota:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Si el dry-run termina con Congratulations, all simulated renewals succeeded, puede olvidarse de su certificado para siempre. Consejo de administrador: si un servicio debe recargarse después de la renovación (Nginx se recarga solo a través del plugin, pero no un servidor de correo, por ejemplo), utilice un deploy hook:

sudo certbot renew --deploy-hook "systemctl reload postfix"

Ir más allá: certificado wildcard (*.your-domain.com)

Un certificado wildcard cubre todos los subdominios de una vez, práctico cuando aloja app., api. y blog. en el mismo VPS. Let's Encrypt lo permite, pero únicamente a través del desafío DNS-01: en lugar de un archivo en el puerto 80, usted prueba el control del dominio creando un registro TXT _acme-challenge:

sudo certbot certonly --manual --preferred-challenges dns \
  -d "your-domain.com" -d "*.your-domain.com"

El modo --manual requiere recrear el TXT en cada renovación: en producción, utilice mejor un plugin DNS (certbot-dns-cloudflare, certbot-dns-ovh…) que automatiza la creación del registro a través de la API de su zona DNS.

Los 5 errores más frecuentes (y sus soluciones)

1. "Connection refused" o "Timeout during connect" el puerto 80 está cerrado o filtrado. Verifique sudo ufw status y no olvide que HTTP-01 exige el puerto 80 abierto incluso si su sitio solo servirá HTTPS.

2. "DNS problem: NXDOMAIN" el registro A aún no existe o no ha terminado de propagarse. Pruebe con dig +short your-domain.com: mientras la IP del VPS no aparezca, no es necesario relanzar Certbot.

3. La trampa del registro AAAA un clásico que vemos a menudo en soporte: Let's Encrypt prioriza IPv6 cuando existe un registro AAAA. Si este apunta a una IP donde su servidor web no escucha, la validación falla aunque el sitio funcione en IPv4. Corrija el AAAA o configure Nginx para escuchar en [::]:80.

4. "too many certificates already issued" ha alcanzado el límite de tasa de Let's Encrypt (50 certificados por dominio y por semana, y sobre todo 5 duplicados exactos por semana). Es frecuente cuando se relanza el comando en bucle para "probar". Utilice siempre --dry-run para sus pruebas: el servidor de staging no tiene estos límites.

5. La renovación falla mientras que la emisión ha funcionado típicamente, ha cambiado la configuración de Nginx entre tanto (eliminación del bloque server, puerto 80 redirigido a otro lugar, firewall ajustado). El --dry-run después de cada gran modificación de configuración le evitará la mala sorpresa 60 días después.

Buenas prácticas para un HTTPS sólido

El certificado no es más que la mitad del trabajo. Para una configuración TLS digna de ese nombre: fuerce la redirección 301 de HTTP a HTTPS (Certbot lo propone), active HSTS (add_header Strict-Transport-Security "max-age=31536000" always; en Nginx) para que los navegadores nunca intenten HTTP, y controle su nota en SSL Labs, apunte a A o A+. Los parámetros TLS generados por Certbot (options-ssl-nginx.conf) siguen las recomendaciones de Mozilla y ya dan un A en la mayoría de los casos.

Finalmente, HTTPS solo protege el transporte: también piense en asegurar el acceso SSH, el firewall y sus aplicaciones. Nuestras guías asegurar phpMyAdmin con Nginx y desplegar Laravel en un VPS muestran cómo integrar correctamente el SSL en una pila completa, y todos nuestros tutoriales están disponibles en la documentación de Linux.

FAQ – Certbot y Let's Encrypt

¿Certbot es realmente gratuito? Sí, totalmente. Let's Encrypt se financia a través de donaciones y patrocinadores (EFF, Mozilla…). Sin límite en el número de dominios, ningún costo oculto.

¿Un certificado Let's Encrypt es tan "seguro" como un certificado de pago? El cifrado es estrictamente idéntico (mismo TLS, mismos algoritmos). Los certificados de pago se distinguen únicamente por la validación de organización (OV/EV) y la garantía contractual, no por la seguridad técnica.

¿Por qué solo 90 días de validez? Elección de seguridad deliberada: limitar la duración de explotación de una clave comprometida y forzar la automatización de la renovación. Con el temporizador de Certbot, es transparente.

¿Puedo usar Certbot en un VPS Windows? Certbot está diseñado para Linux. En Windows Server (IIS), utilice un cliente ACME como win-acme, o coloque el TLS en un reverse proxy Linux en frontal.

¿Cuánto tiempo toma la instalación completa? En un VPS limpio con el DNS ya propagado: menos de 5 minutos, incluida la instalación de Certbot.

Conclusión

Con Certbot, el HTTPS ya no es un gasto ni una tarea trimestral: un comando para emitir, un temporizador para renovar, y un --dry-run para dormir tranquilo. La única verdadera condición es partir de una base sana: un servidor con IP dedicada, acceso root y puertos que usted controla.

Si aún no tiene su servidor, nuestros VPS Linux NVMe se entregan en menos de 60 segundos con Debian o Ubuntu preinstalado, una IP dedicada y la protección anti-DDoS incluida, todo lo necesario para seguir esta guía de A a Z.