Sin HTTPS tu web muestra “No seguro” en el navegador. Los usuarios desconfían y Google te penaliza. La buena noticia: con Let’s Encrypt tienes SSL gratis en minutos.
Esta guía te enseña a configurar HTTPS en tu VPS correctamente.
¿Por qué necesitas SSL?
| Sin SSL | Con SSL |
|---|---|
| ”No seguro” en navegador | Candado verde |
| Datos sin cifrar | Comunicación cifrada |
| Penalización SEO | Mejor ranking |
| Sin HTTP/2 | HTTP/2 habilitado |
| Usuarios desconfían | Genera confianza |
Tipos de certificados
| Tipo | Validación | Tiempo | Coste | Uso |
|---|---|---|---|---|
| DV | Dominio | Minutos | Gratis-€50 | Blogs, webs pequeñas |
| OV | Organización | Días | €50-200 | Empresas |
| EV | Extendida | Semanas | €200-500 | Bancos, e-commerce |
| Wildcard | Subdominios | Variable | Variable | Múltiples subdominios |
Let’s Encrypt ofrece certificados DV gratuitos, perfectos para la mayoría de casos.
Instalar Certbot
Ubuntu/Debian
# Instalar Certbot
sudo apt update
sudo apt install certbot -y
# Para Nginx
sudo apt install python3-certbot-nginx -y
# Para Apache
sudo apt install python3-certbot-apache -y
Rocky/AlmaLinux
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-nginx -y
SSL con Nginx
Método automático (recomendado)
# Certbot configura todo automáticamente
sudo certbot --nginx -d tudominio.com -d www.tudominio.com
# Seguir instrucciones:
# 1. Email para notificaciones
# 2. Aceptar términos
# 3. Elegir redirect HTTP→HTTPS (opción 2)
Verificar configuración
# Certbot añade esto a tu configuración Nginx
cat /etc/nginx/sites-available/tudominio.com
server {
listen 443 ssl;
server_name tudominio.com www.tudominio.com;
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/tudominio;
index index.html index.php;
# ... resto de configuración
}
server {
listen 80;
server_name tudominio.com www.tudominio.com;
return 301 https://$host$request_uri;
}
Método manual
Si prefieres control total:
# Solo obtener certificado
sudo certbot certonly --nginx -d tudominio.com -d www.tudominio.com
# Configurar manualmente en Nginx
server {
listen 443 ssl http2;
server_name tudominio.com www.tudominio.com;
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
# Configuración SSL moderna
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/tudominio;
# ...
}
SSL con Apache
Método automático
sudo certbot --apache -d tudominio.com -d www.tudominio.com
Verificar configuración
cat /etc/apache2/sites-available/tudominio-le-ssl.conf
<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
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
Renovación automática
Verificar timer de renovación
# Certbot crea un timer automático
sudo systemctl status certbot.timer
# Ver próxima ejecución
sudo systemctl list-timers | grep certbot
Probar renovación
# Simular renovación (no renueva realmente)
sudo certbot renew --dry-run
# Si funciona, la renovación automática está OK
Renovación manual
# Renovar todos los certificados
sudo certbot renew
# Renovar certificado específico
sudo certbot renew --cert-name tudominio.com
Crear cron de renovación (si no hay timer)
# Cron para renovar cada 12 horas
sudo crontab -e
0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
Certificado Wildcard
Para cubrir todos los subdominios (*.tudominio.com):
Requisitos
- Acceso al DNS del dominio
- Plugin DNS de Certbot o validación manual
Con Cloudflare
# Instalar plugin
sudo apt install python3-certbot-dns-cloudflare -y
# Crear archivo de credenciales
sudo nano /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = tu-api-token-de-cloudflare
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# Obtener wildcard
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d tudominio.com \
-d *.tudominio.com
Validación manual DNS
sudo certbot certonly --manual --preferred-challenges dns \
-d tudominio.com -d *.tudominio.com
# Certbot te pedirá crear un registro TXT
# _acme-challenge.tudominio.com con un valor específico
# Crear el registro y esperar propagación antes de continuar
Múltiples dominios
Un certificado para varios dominios
sudo certbot --nginx \
-d dominio1.com -d www.dominio1.com \
-d dominio2.com -d www.dominio2.com
Certificados separados
sudo certbot --nginx -d dominio1.com -d www.dominio1.com
sudo certbot --nginx -d dominio2.com -d www.dominio2.com
Configuración SSL óptima
Headers de seguridad
server {
listen 443 ssl http2;
# ...
# HSTS - Forzar HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Prevenir clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Prevenir XSS
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Referrer policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}
Verificar configuración SSL
# Test local
openssl s_client -connect tudominio.com:443 -servername tudominio.com
# Ver certificado
echo | openssl s_client -connect tudominio.com:443 2>/dev/null | openssl x509 -text -noout
# Fecha de expiración
echo | openssl s_client -connect tudominio.com:443 2>/dev/null | openssl x509 -noout -dates
Herramientas online:
- ssllabs.com/ssltest
- securityheaders.com
Forzar HTTPS
En Nginx
server {
listen 80;
server_name tudominio.com www.tudominio.com;
return 301 https://$host$request_uri;
}
En Apache
<VirtualHost *:80>
ServerName tudominio.com
Redirect permanent / https://tudominio.com/
</VirtualHost>
En WordPress (wp-config.php)
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
Errores comunes
”Certificate not yet valid"
# Verificar hora del servidor
date
timedatectl
# Sincronizar hora
sudo timedatectl set-ntp true
"Too many certificates”
Let’s Encrypt tiene límites:
- 50 certificados por dominio por semana
- 5 duplicados por semana
# Ver certificados actuales
sudo certbot certificates
# Revocar si es necesario
sudo certbot revoke --cert-name tudominio.com
”DNS problem” o “Unauthorized”
# Verificar que DNS apunta correctamente
dig tudominio.com +short
# Verificar que puerto 80 está abierto
sudo ufw status
curl -I http://tudominio.com
Renovación falla
# Ver logs
sudo journalctl -u certbot
# Verificar que el servidor web está corriendo
sudo systemctl status nginx
# Probar validación manual
sudo certbot certonly --dry-run -d tudominio.com
Mixed content (contenido mixto)
# Buscar URLs http:// en tu sitio
grep -r "http://" /var/www/tudominio --include="*.php" --include="*.html"
# En WordPress, actualizar URLs en base de datos
wp search-replace 'http://tudominio.com' 'https://tudominio.com' --path=/var/www/wordpress
Gestionar certificados
Ver certificados instalados
sudo certbot certificates
Eliminar certificado
sudo certbot delete --cert-name tudominio.com
Revocar certificado
sudo certbot revoke --cert-name tudominio.com
Expandir certificado (añadir dominios)
sudo certbot --nginx --expand -d tudominio.com -d www.tudominio.com -d nuevo.tudominio.com
SSL con Cloudflare
Modos de SSL
| Modo | Comportamiento |
|---|---|
| Off | Sin SSL |
| Flexible | SSL solo navegador↔Cloudflare |
| Full | SSL en todo, acepta certificado inválido |
| Full (Strict) | SSL en todo, requiere certificado válido |
Recomendado: Full (Strict) con Let’s Encrypt en tu VPS.
Certificado de origen Cloudflare
Si prefieres no usar Let’s Encrypt:
- Cloudflare Dashboard → SSL/TLS → Origin Server
- Create Certificate
- Descargar .pem y .key
- Configurar en Nginx
Preguntas frecuentes
¿Let's Encrypt es seguro para producción?
Sí, absolutamente. Let's Encrypt es una CA reconocida por todos los navegadores. Lo usan millones de sitios incluyendo grandes empresas.
¿Cada cuánto se renuevan los certificados?
Los certificados de Let's Encrypt duran 90 días. Certbot intenta renovar cuando quedan 30 días, automáticamente si configuraste el timer.
¿Puedo usar Let's Encrypt para e-commerce?
Sí. Para e-commerce básico, Let's Encrypt es suficiente. Solo considera certificados EV si necesitas mostrar el nombre de la empresa en la barra del navegador.
¿Por qué mi certificado no cubre www?
Debes incluir ambos dominios al crear el certificado: -d tudominio.com -d www.tudominio.com. Puedes expandir un certificado existente con --expand.
¿Qué pasa si el certificado expira?
Tu sitio mostrará error de certificado y los usuarios verán una advertencia. Configura renovación automática y alertas por email para evitarlo.
Nuestra recomendación
Setup básico:
- Instalar Certbot con plugin de tu servidor
certbot --nginx -d tudominio.com -d www.tudominio.com- Verificar renovación automática
- Probar con SSL Labs
Para máxima seguridad:
- Headers de seguridad (HSTS, X-Frame-Options)
- SSL Labs grado A+
- Monitorizar expiración
¿Necesitas SSL gestionado? El hosting WordPress de Avantys incluye SSL automático sin configuración.
Conclusión
Con Let’s Encrypt y Certbot, no hay excusa para no tener HTTPS. En 5 minutos tienes tu VPS protegido con SSL gratuito y renovación automática.
Recuerda probar tu configuración en SSL Labs y configurar alertas de expiración.
¿Necesitas un VPS con SSL incluido? Explora los VPS de Avantys con certificados SSL gratuitos.
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.