¿Está mi certificado SSL bien configurado?
Respuesta corta: está bien configurado cuando el certificado es de confianza (cadena completa), cubre todos los nombres que usas (con y sin www), se renueva automáticamente con bastante antelación, solo están activados TLS 1.2 y 1.3, toda petición http:// redirige a https:// y HSTS está configurado. El candado por sí solo solo demuestra el primer punto.
Pasos rápidos
- Comprueba que la cadena es de confianza. Abre el sitio en una ventana privada en un móvil y en un ordenador; no debería aparecer ningún aviso.
- Comprueba los nombres. El certificado debe incluir tanto tudominio.com como www.tudominio.com si usas ambos.
- Comprueba la caducidad y la renovación. Lee notAfter y prueba que la renovación automática funciona.
- Comprueba las versiones de TLS. Permite solo TLS 1.2 y TLS 1.3.
- Comprueba la redirección. http:// debe redirigir de forma permanente a https://.
- Comprueba HSTS. Envía Strict-Transport-Security cuando HTTPS funcione en todas partes.
El código y la configuración se mantienen en inglés.
1. Una cadena completa y de confianza
Los servidores también deben enviar el certificado intermedio. Si falta, a menudo funciona en navegadores de escritorio pero falla en móviles y clientes de API.
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts </dev/null 2>/dev/null | grep -E 's:|i:|Verify return'Busca Verify return code: 0 (ok). En nginx, ssl_certificate debería apuntar al archivo de cadena completa (con Let’s Encrypt: fullchain.pem, no cert.pem).
2. Todos los nombres están cubiertos
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
| openssl x509 -noout -ext subjectAltName3. Caducidad y renovación automática
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
| openssl x509 -noout -enddate
sudo certbot renew --dry-run # if you use certbotHackGrade marca un certificado como riesgo medio cuando faltan menos de 21 días para que caduque, alto con menos de 14 días, y crítico cuando ya ha caducado o no es de confianza.
4. Solo TLS 1.2 y 1.3
ssl_protocols TLSv1.2 TLSv1.3;SSLProtocol -all +TLSv1.2 +TLSv1.3Comprueba que se rechaza una versión antigua (el comando debería fallar al conectar):
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -tls1_1 </dev/null5. HTTP redirige a HTTPS
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]6. HSTS
Cuando todas las páginas y subdominios funcionen por HTTPS, añade Strict-Transport-Security. Lee antes la guía de HSTS (en inglés): empieza con un max-age corto y ve subiéndolo. Después corrige el contenido mixto (en inglés) que quede.
Preguntas frecuentes
¿Un certificado gratuito (Let’s Encrypt) es menos seguro que uno de pago?
No. El cifrado es el mismo. Los certificados de pago se diferencian en el tipo de validación, el soporte y la garantía, no en lo bien que cifran.
¿Por qué mi sitio muestra un aviso solo en algunos móviles?
Normalmente por falta del certificado intermedio. Configura el servidor con el archivo de cadena completa.
¿Debería seguir admitiendo TLS 1.0 o 1.1?
No. Ambos están obsoletos (RFC 8996) y los navegadores modernos ya no los admiten.