HTTPS ya no es opcional. Google penaliza sitios sin SSL, los navegadores muestran advertencias y los usuarios no confían en páginas inseguras.
Let’s Encrypt revolucionó el SSL: certificados gratuitos, automáticos y reconocidos por todos los navegadores. No hay excusa para no tener HTTPS.
Esta guía te enseña a configurar SSL correctamente en tu VPS, desde lo básico hasta configuraciones avanzadas.
Por qué necesitas SSL
Sin SSL (HTTP)
Usuario ──────────────────────────── Servidor
Datos en texto plano
Cualquiera puede leer
Contraseñas visibles
Con SSL (HTTPS)
Usuario ═══════════════════════════ Servidor
Datos cifrados
Imposible interceptar
Contraseñas protegidas
Impacto real
| Aspecto | Sin SSL | Con SSL |
|---|---|---|
| SEO Google | Penalizado | Favorecido |
| Navegadores | ”No seguro” | Candado verde |
| Confianza usuario | Baja | Alta |
| Datos sensibles | Expuestos | Protegidos |
| HTTP/2 | No disponible | Disponible |
Tipos de certificados SSL
Por validación
| Tipo | Validación | Tiempo | Uso |
|---|---|---|---|
| DV (Domain) | Solo dominio | Minutos | Blogs, webs personales |
| OV (Organization) | Empresa verificada | Días | Empresas, e-commerce |
| EV (Extended) | Verificación exhaustiva | Semanas | Bancos, grandes empresas |
Let’s Encrypt ofrece certificados DV, suficientes para la mayoría de casos.
Por cobertura
| Tipo | Cubre | Ejemplo |
|---|---|---|
| Single | Un dominio | tudominio.com |
| Wildcard | Dominio + subdominios | *.tudominio.com |
| Multi-domain (SAN) | Varios dominios | tudominio.com + otro.com |
Let’s Encrypt: lo básico
Qué es
Let’s Encrypt es una autoridad certificadora gratuita, automatizada y abierta. Emite certificados DV reconocidos por todos los navegadores.
Limitaciones
- Duración: 90 días (renovación automática)
- Rate limits: 50 certificados por dominio/semana
- Solo DV: No hay OV ni EV
- Sin garantía: No hay seguro asociado
Para el 95% de sitios web, estas limitaciones no importan.
Certbot
Certbot es la herramienta oficial para obtener y renovar certificados de Let’s Encrypt.
Instalación de Certbot
Ubuntu/Debian
sudo apt update
sudo apt install certbot -y
Con plugin para Nginx
sudo apt install certbot python3-certbot-nginx -y
Con plugin para Apache
sudo apt install certbot python3-certbot-apache -y
Verificar instalación
certbot --version
Obtener certificado (método fácil)
Para Nginx
sudo certbot --nginx -d tudominio.com -d www.tudominio.com
Certbot automáticamente:
- Verifica que controlas el dominio
- Obtiene el certificado
- Configura Nginx para usarlo
- Configura redirección HTTP → HTTPS
Para Apache
sudo certbot --apache -d tudominio.com -d www.tudominio.com
Interactivo
Certbot te preguntará:
- Email para notificaciones
- Aceptar términos de servicio
- Compartir email con EFF (opcional)
- Redirigir HTTP a HTTPS (recomendado: sí)
Obtener certificado (método manual)
Si prefieres configurar el servidor manualmente:
sudo certbot certonly --webroot -w /var/www/html -d tudominio.com -d www.tudominio.com
O con standalone (para el puerto 80 temporalmente):
sudo systemctl stop nginx
sudo certbot certonly --standalone -d tudominio.com
sudo systemctl start nginx
Ubicación de certificados
/etc/letsencrypt/live/tudominio.com/
├── fullchain.pem # Certificado + intermedios
├── privkey.pem # Clave privada
├── cert.pem # Solo tu certificado
└── chain.pem # Certificados intermedios
Certificado Wildcard
Los wildcards cubren todos los subdominios: *.tudominio.com
Requisito: validación DNS
Wildcards requieren validación DNS (no HTTP). Necesitas añadir un registro TXT a tu DNS.
Obtener wildcard
sudo certbot certonly --manual --preferred-challenges dns -d tudominio.com -d *.tudominio.com
Certbot te pedirá crear un registro DNS:
_acme-challenge.tudominio.com TXT "valor_aleatorio"
- Añade el registro en tu panel DNS
- Espera propagación (1-5 minutos)
- Presiona Enter en Certbot
Automatizar wildcard con plugin DNS
Para renovación automática, usa plugins DNS:
Cloudflare:
sudo apt install python3-certbot-dns-cloudflare
# Crear archivo de credenciales
sudo nano /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = TU_API_TOKEN
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d tudominio.com -d *.tudominio.com
Plugins disponibles para: Cloudflare, Route53, DigitalOcean, Google Cloud, OVH, etc.
Configuración SSL segura
Nginx - Configuración moderna
server {
listen 443 ssl http2;
server_name tudominio.com www.tudominio.com;
# Certificados
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
# Protocolos (solo TLS 1.2 y 1.3)
ssl_protocols TLSv1.2 TLSv1.3;
# Ciphers seguros
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Session cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# Headers de seguridad
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
root /var/www/tudominio;
index index.html index.php;
}
# Redirección HTTP → HTTPS
server {
listen 80;
server_name tudominio.com www.tudominio.com;
return 301 https://$server_name$request_uri;
}
Apache - Configuración moderna
<VirtualHost *:443>
ServerName tudominio.com
ServerAlias www.tudominio.com
DocumentRoot /var/www/tudominio
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/tudominio.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tudominio.com/privkey.pem
# Protocolos
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
# Ciphers
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
# OCSP Stapling
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
# Headers
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
<VirtualHost *:80>
ServerName tudominio.com
Redirect permanent / https://tudominio.com/
</VirtualHost>
Renovación automática
Verificar renovación
sudo certbot renew --dry-run
Cron automático
Certbot instala un cron/timer automático. Verificar:
# Timer de systemd
sudo systemctl status certbot.timer
# O cron
cat /etc/cron.d/certbot
Renovación manual
sudo certbot renew
Hooks post-renovación
Para reiniciar servicios después de renovar:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Verificar configuración SSL
SSL Labs
ssllabs.com/ssltest - Análisis completo gratuito.
Objetivo: Calificación A o A+
Desde terminal
# Ver certificado
openssl s_client -connect tudominio.com:443 -servername tudominio.com
# Ver fechas
echo | openssl s_client -connect tudominio.com:443 2>/dev/null | openssl x509 -noout -dates
# Ver detalles
curl -vI https://tudominio.com 2>&1 | grep -A6 "Server certificate"
Múltiples dominios en un VPS
Opción 1: Certificado por dominio
sudo certbot --nginx -d dominio1.com -d www.dominio1.com
sudo certbot --nginx -d dominio2.com -d www.dominio2.com
Opción 2: Certificado multi-dominio (SAN)
sudo certbot --nginx -d dominio1.com -d www.dominio1.com -d dominio2.com -d www.dominio2.com
Máximo 100 dominios por certificado.
Opción 3: Wildcard + dominios
sudo certbot --nginx -d tudominio.com -d *.tudominio.com
HSTS: HTTP Strict Transport Security
HSTS fuerza HTTPS en el navegador. Una vez activado, el navegador solo usa HTTPS.
Activar HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Parámetros:
max-age: Tiempo en segundos (2 años recomendado)includeSubDomains: Aplica a subdominiospreload: Permite añadirse a lista preload de navegadores
Cuidado con HSTS
Una vez activado con max-age largo, no puedes volver a HTTP fácilmente. Empieza con valores bajos:
# Primero prueba con 5 minutos
add_header Strict-Transport-Security "max-age=300" always;
# Si todo funciona, aumenta gradualmente
add_header Strict-Transport-Security "max-age=86400" always; # 1 día
add_header Strict-Transport-Security "max-age=63072000" always; # 2 años
Problemas comunes
Error: “too many certificates”
Has superado el rate limit. Espera una semana o usa staging:
sudo certbot --staging -d tudominio.com
Error: “connection refused”
Puerto 80 no accesible. Verifica:
- Firewall permite puerto 80
- Nginx/Apache corriendo
- DNS apunta a tu IP
Error: “unauthorized”
El archivo de verificación no es accesible. Verifica:
- DocumentRoot correcto
- Permisos de archivos
- No hay redirecciones que interfieran
Mixed content
Tu sitio carga recursos HTTP en página HTTPS.
<!-- ❌ Mal -->
<img src="http://tudominio.com/imagen.jpg">
<!-- ✅ Bien -->
<img src="https://tudominio.com/imagen.jpg">
<!-- O mejor -->
<img src="/imagen.jpg">
Certificado expirado
# Verificar fecha
sudo certbot certificates
# Renovar manualmente
sudo certbot renew --force-renewal
SSL con Cloudflare
Si usas Cloudflare como CDN:
Modo Full (Strict)
Requiere certificado válido en tu VPS (Let’s Encrypt).
Visitante ←HTTPS→ Cloudflare ←HTTPS→ VPS (con cert válido)
Recomendado: Máxima seguridad.
Modo Full
Acepta certificado self-signed en el origen.
Modo Flexible
Solo HTTPS entre visitante y Cloudflare. No recomendado.
Certificado origen Cloudflare
Cloudflare puede generar un certificado para tu origen (15 años):
- Dashboard → SSL/TLS → Origin Server
- Create Certificate
- Instalar en tu VPS
Solo válido con Cloudflare como proxy.
Automatización completa
Script de setup SSL
#!/bin/bash
# /root/scripts/setup-ssl.sh
DOMAIN=$1
EMAIL="[email protected]"
if [ -z "$DOMAIN" ]; then
echo "Uso: $0 dominio.com"
exit 1
fi
# Obtener certificado
certbot --nginx -d $DOMAIN -d www.$DOMAIN --non-interactive --agree-tos --email $EMAIL
# Verificar
certbot certificates | grep $DOMAIN
echo "SSL configurado para $DOMAIN"
chmod +x /root/scripts/setup-ssl.sh
./setup-ssl.sh nuevodominio.com
Checklist SSL
Básico
| Tarea | Verificación | ✓ |
|---|---|---|
| Certbot instalado | certbot --version | ☐ |
| Certificado activo | certbot certificates | ☐ |
| HTTPS funciona | Visitar sitio | ☐ |
| Redirección HTTP→HTTPS | curl -I http://tudominio.com | ☐ |
Seguridad
| Tarea | Verificación | ✓ |
|---|---|---|
| TLS 1.2+ solamente | SSL Labs test | ☐ |
| HSTS activo | Headers en respuesta | ☐ |
| Calificación A/A+ | SSL Labs | ☐ |
| Renovación automática | certbot renew --dry-run | ☐ |
Preguntas frecuentes
¿Let’s Encrypt es seguro para e-commerce?
Sí, técnicamente es igual de seguro que certificados de pago. La diferencia es solo el tipo de validación (DV vs OV/EV).
¿Por qué solo 90 días?
Por seguridad. Certificados cortos limitan el daño si se comprometen. La renovación automática lo hace transparente.
¿Puedo usar Let’s Encrypt en producción?
Absolutamente. Millones de sitios lo usan, incluyendo grandes empresas.
¿Qué pasa si caduca el certificado?
Los navegadores muestran error de seguridad. Por eso es crucial la renovación automática.
Nuestra recomendación
Para cualquier VPS:
- Instala Certbot con plugin de tu servidor web
- Obtén certificado con un comando
- Verifica renovación automática
- Configura HSTS después de probar
¿Quieres SSL sin complicaciones? Los VPS de Avantys con administración gestionada incluyen configuración SSL profesional.
Conclusión
SSL con Let’s Encrypt es gratis, automático y no hay excusa para no tenerlo. Un comando y tu sitio está protegido.
No dejes tu VPS sin HTTPS. Configúralo hoy, tarda 5 minutos y la diferencia en seguridad, SEO y confianza es enorme.
¿Quieres un VPS con SSL preconfigurado? Explora los VPS de Avantys con certificados incluidos.
Guías relacionadas
- CDN para tu VPS con Cloudflare
- Firewall en VPS: UFW e iptables
- Nginx vs Apache en VPS
- Securizar un VPS Linux
¿Quieres la guía completa con todos los casos de uso?
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.