Guía completa de certificados SSL
Contenido
¿Qué es SSL/TLS?
SSL (Secure Sockets Layer) y su sucesor TLS (Transport Layer Security) son protocolos criptográficos que aseguran la comunicación en internet. Cuando visitas un sitio HTTPS, TLS cifra la conexión entre tu navegador y el servidor, previniendo la interceptación y la manipulación de datos.
- Cifrado — protege datos sensibles en tránsito
- Autenticación — confirma la identidad del servidor
- Integridad — asegura que los datos no han sido modificados
- SEO — Google usa HTTPS como señal de posicionamiento
- Confianza — los navegadores muestran un ícono de candado para sitios HTTPS
Cómo funciona
El handshake TLS establece una conexión segura en estos pasos:
- Client hello — el navegador envía las versiones TLS y suites de cifrado soportadas
- Server hello — el servidor selecciona una versión/cifrado y envía su certificado
- Verificación del certificado — el navegador valida el certificado (emisor, vencimiento, coincidencia de dominio)
- Intercambio de claves — ambas partes derivan una clave de sesión compartida
- Comunicación cifrada — todo el tráfico posterior está cifrado
Cadena de certificados
CA raíz
└─ CA intermedia
└─ Certificado de entidad final (tu sitio)
Los navegadores confían en una lista integrada de CAs raíz. Validan tu certificado recorriendo la cadena hasta una raíz de confianza.
Tipos de certificados
Por nivel de validación
DV — Validación de dominio
Verifica solo la propiedad del dominio. Se emite en minutos. Gratuito con Let's Encrypt. Adecuado para la mayoría de los sitios web.
OV — Validación de organización
Verifica la propiedad del dominio más la identidad de la organización. Tarda 1–3 días hábiles. Adecuado para sitios empresariales.
EV — Validación extendida
La verificación más estricta — comprobaciones de entidad legal, verificación telefónica. Tarda 1–2 semanas. Usado por bancos y grandes comercios electrónicos. Nota: desde 2019, los principales navegadores ya no muestran la barra verde con el nombre de la organización.
Por cobertura
- Dominio único — cubre un dominio, ej.
www.example.com - Wildcard — cubre todos los subdominios, ej.
*.example.com - Multi-dominio (SAN) — cubre múltiples dominios diferentes en un solo certificado
Cómo verificar un certificado
Navegador
Haz clic en el ícono del candado en la barra de direcciones → ver detalles del certificado: emitido para, emisor, fecha de vencimiento.
Línea de comandos
# Ver información del certificado
openssl s_client -connect example.com:443 -servername example.com
# Verificar fecha de vencimiento
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates
Herramientas en línea
- SSL Labs — prueba completa de configuración SSL
- 301check.com — muestra información TLS en cada salto de una cadena de redirección
- crt.sh — búsqueda en logs de transparencia de certificados
Errores comunes
Certificado expirado — NET::ERR_CERT_DATE_INVALID
Renueva el certificado. Usa la renovación automática de Certbot para prevenir esto.
Dominio no coincide — NET::ERR_CERT_COMMON_NAME_INVALID
El certificado no cubre el dominio al que se accede. Obtén un certificado para el dominio correcto, o usa un certificado wildcard.
Cadena incompleta — NET::ERR_CERT_AUTHORITY_INVALID
Falta el certificado intermedio en la configuración del servidor.
# Nginx — usa fullchain.pem, no solo cert.pem
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
Contenido mixto
Una página HTTPS cargando recursos HTTP (imágenes, scripts, hojas de estilo). Actualiza todas las URLs de recursos a HTTPS o usa URLs relativas al protocolo (//example.com/image.jpg).
Let's Encrypt
Let's Encrypt es una CA gratuita, automatizada y abierta administrada por la organización sin fines de lucro ISRG. Ha hecho que HTTPS sea accesible para todos.
Certbot (recomendado)
# Instalar en Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx
# Emitir y configurar automáticamente en Nginx
sudo certbot --nginx -d example.com -d www.example.com
# Probar renovación automática
sudo certbot renew --dry-run
# Cron para renovación automática
0 0,12 * * * certbot renew --quiet
acme.sh (alternativa ligera)
curl https://get.acme.sh | sh
acme.sh --issue -d example.com -d www.example.com --nginx
Mejores prácticas
# Nginx — configuración TLS robusta
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# Habilitar HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
- Configura alertas de vencimiento de certificados (30 días antes)
- Usa registros DNS CAA para restringir qué CAs pueden emitir para tu dominio
- Monitorea los logs de transparencia de certificados para emisiones no autorizadas
- Prueba tu configuración con SSL Labs