La configuración SSL/TLS ha cambiado significativamente. Este es el estado actual de las mejores prácticas a partir de 2026 — qué habilitar, qué desactivar y qué viene.
Versiones de protocolo
| Protocolo | Estado | Acción |
|---|---|---|
| SSL 2.0, 3.0 | Roto | Desactivar — vulnerabilidades críticas (POODLE, DROWN) |
| TLS 1.0 | Obsoleto (2021) | Desactivar — vulnerabilidad BEAST |
| TLS 1.1 | Obsoleto (2021) | Desactivar — sin soporte de cifrado moderno |
| TLS 1.2 | Seguro | Habilitar — solo con cifrados AEAD |
| TLS 1.3 | Estándar actual | Habilitar — el más rápido y seguro |
Nginx: ssl_protocols TLSv1.2 TLSv1.3;
Apache: SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
Suites de cifrado
TLS 1.3 (sin configuración necesaria)
Las 5 suites de cifrado son seguras. No intentes personalizarlas — no puedes mejorarlas.
TLS 1.2 (restringir a solo AEAD)
# Nginx
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
Reglas:
- Solo suites
ECDHE-*— asegura secreto perfecto hacia adelante - Solo
*-GCM-*o*-CHACHA20-*— solo cifrados AEAD - Sin cifrados CBC — vulnerables a BEAST, Lucky13
ssl_prefer_server_ciphers off— dejar que el cliente elija (los clientes modernos eligen la mejor opción)
Gestión de certificados
| Práctica | Por qué |
|---|---|
| Usar claves ECDSA P-256 | Más pequeñas, más rápidas que RSA 2048 |
| Automatizar la renovación | La validez de 47 días para 2029 hace la renovación manual impracticable |
Servir fullchain.pem | Previene errores de cadena de confianza |
| Monitorear vencimiento del certificado | Configurar alertas para el día 60 de 90 |
| Usar monitoreo de Certificate Transparency | Detectar certificados no autorizados |
| Rotar claves en cada renovación | No reutilizar claves privadas entre certificados |
Cabeceras de seguridad
# HSTS — always use HTTPS (start with short max-age, increase later)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# Prevent MIME-type sniffing
add_header X-Content-Type-Options "nosniff" always;
# Prevent clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Upgrade insecure sub-resources
add_header Content-Security-Policy "upgrade-insecure-requests" always;
Optimización de rendimiento
| Configuración | Config | Beneficio |
|---|---|---|
| HTTP/2 | listen 443 ssl http2; | Multiplexación, compresión de cabeceras |
| Caché de sesión | ssl_session_cache shared:SSL:10m; | Evita re-negociación para visitantes recurrentes |
| Tickets de sesión desactivados | ssl_session_tickets off; | Mejor secreto perfecto hacia adelante |
| OCSP stapling | ssl_stapling on; | Verificación de certificado más rápida, mejor privacidad |
| Datos tempranos (0-RTT) | Por defecto en TLS 1.3 | Reanudación con latencia cero (usar con precaución) |
Configuración completa de Nginx (lista para producción)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
root /var/www/html;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Prueba: Ingresa tu dominio en SSL Labs — esta configuración debería obtener un grado A+.
Qué NO hacer
| Mala práctica | Por qué | Qué hacer en su lugar |
|---|---|---|
ssl_protocols TLSv1 TLSv1.1; | Obsoletos, vulnerables | Solo TLS 1.2 + 1.3 |
ssl_ciphers ALL; | Incluye cifrados débiles | Lista explícita ECDHE + AEAD |
ssl_prefer_server_ciphers on; (TLS 1.3) | Innecesario — los cifrados TLS 1.3 son todos seguros | off |
Usar cert.pem en lugar de fullchain.pem | Cadena faltante → errores de confianza | Siempre fullchain.pem para Nginx |
| Certificados autofirmados en producción | Advertencias del navegador, sin confianza | Let’s Encrypt (gratis) |
| Misma clave privada durante años | Limita la contención de daños | Rotar en cada renovación |
| Sin HSTS | Vulnerable a ataques de degradación | Habilitar después de probar |
max-age=0 para HSTS | Efectivamente desactiva HSTS | Empezar en 300, aumentar a 63072000 |
Preguntas frecuentes
¿Cómo pruebo mi configuración SSL?
SSL Labs Server Test — ingresa tu dominio, obtén un informe detallado con calificación (A-F). Verifica soporte de protocolos, fortaleza de cifrados, validez de cadena y vulnerabilidades conocidas.
¿Qué calificación debo buscar?
A+ para sitios en producción. Esto requiere: solo TLS 1.2+, cifrados AEAD, cadena válida, HSTS con max-age largo. La configuración de arriba logra A+.
¿Con qué frecuencia debo revisar mi configuración SSL?
Anualmente, o cuando se anuncie una nueva vulnerabilidad. Suscríbete a la página de estado de Let’s Encrypt y sigue el Mozilla SSL Configuration Generator para recomendaciones actualizadas.
¿Existe una herramienta que genere la configuración correcta para mí?
Sí — Mozilla SSL Configuration Generator. Selecciona tu servidor (Nginx, Apache, etc.), tu versión del servidor y genera una configuración recomendada. El perfil «Modern» coincide con las prácticas de este artículo.