Guía · 3 min de lectura

¿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.

Actualizado el · HackGrade

Pasos rápidos

  1. 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.
  2. Comprueba los nombres. El certificado debe incluir tanto tudominio.com como www.tudominio.com si usas ambos.
  3. Comprueba la caducidad y la renovación. Lee notAfter y prueba que la renovación automática funciona.
  4. Comprueba las versiones de TLS. Permite solo TLS 1.2 y TLS 1.3.
  5. Comprueba la redirección. http:// debe redirigir de forma permanente a https://.
  6. 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.

Terminal
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

Terminal
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null \
  | openssl x509 -noout -ext subjectAltName

3. Caducidad y renovación automática

Terminal
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 certbot

HackGrade 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

nginx
ssl_protocols TLSv1.2 TLSv1.3;
Apache
SSLProtocol -all +TLSv1.2 +TLSv1.3

Comprueba que se rechaza una versión antigua (el comando debería fallar al conectar):

Terminal
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -tls1_1 </dev/null

5. HTTP redirige a HTTPS

nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}
.htaccess
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.

Fuentes

Guías relacionadas

Gratis · Al instante · Sin registro

Conoce tu nota antes que nadie.

Análisis pasivo. Nada se ataca sin tu permiso.

Empieza gratis. Planes de pago desde 12 $ al mes, o un informe único por 29 $. Ver precios