Hallazgos TLS: qué significa cada uno y cómo corregirlo
Todos los hallazgos que puede comunicar una comprobación TLS, con su significado, su corrección y las referencias que los cuentan. Los hallazgos de disponibilidad fijan el estado de la comprobación sea cual sea su elección; los de configuración cuentan frente a las referencias elegidas y, si no, se registran y cuentan para la calificación. El detalle del resultado enlaza cada hallazgo con su entrada aquí.
Disponibilidad
Hallazgos sobre si los clientes reales pueden conectarse. Fijan el estado en toda comprobación.
Certificado caducado expired
El certificado, o uno de su cadena, ha caducado, y todo cliente rechaza la conexión. Renuévelo e instale el nuevo con sus intermedios; si la renovación es automática, averigüe por qué se detuvo.
Fija el estado en error.
El certificado caduca dentro del plazo de error expiry_error
Un certificado de la cadena caduca dentro de su ventana de error. Renuévelo ya: a estas alturas la renovación automática ha fallado al menos una vez.
Fija el estado en error.
El certificado caduca dentro del plazo de aviso expiry_warning
Un certificado de la cadena caduca dentro de su ventana de aviso. La renovación automática suele llegar antes; compruebe que sigue funcionando.
Fija el estado en advertencia.
Certificado aún no válido not_yet_valid
La validez del certificado empieza en el futuro. O se instaló demasiado pronto o el reloj del sistema emisor va mal; instale un certificado válido ahora.
Fija el estado en error.
Cadena no fiable untrusted
La cadena no lleva a una raíz de confianza. Casi siempre el servidor omite su certificado intermedio: configure la cadena completa que dio la CA. En nginx, ssl_certificate toma el certificado seguido de los intermedios.
Fija el estado en error.
El certificado no cubre el nombre hostname_mismatch
Ningún nombre del certificado cubre el host al que se conecta la comprobación. Emita el certificado para ese nombre, o ponga como nombre de servidor de la comprobación el nombre del certificado.
Fija el estado en error.
Certificado revocado revoked
La CA ha revocado el certificado, y los clientes que comprueban la revocación lo rechazan. Emita e instale uno nuevo; averigüe por qué se revocó, porque suele significar que la clave quedó expuesta.
Fija el estado en error.
Faltan las pruebas de Certificate Transparency ct_non_compliant
Al certificado le faltan las pruebas de Certificate Transparency que exigen los navegadores. Pida a la CA que lo vuelva a emitir; las CA de confianza pública las añaden de serie.
Fija el estado en error.
Ninguna clave coincide con las claves fijadas pin_mismatch
Ninguna clave de la cadena servida coincide con los pines indicados. O el certificado se renovó con una clave nueva, lo que rompe las apps móviles que la fijan, o los pines de la comprobación están desactualizados. Tenga un pin de reserva para la próxima clave.
Fija el estado en error.
Los registros CAA excluyen a la CA emisora caa_forbids_issuer
Los registros CAA del nombre no permiten a la CA que emitió el certificado actual, así que su renovación será rechazada. Añada esa CA a los registros o cambie de CA antes de renovar.
Fija el estado en advertencia.
Handshake rechazado handshake_refused
El servidor rechaza lo que ofrecen los clientes actuales, o el puerto no habla TLS. Revise el puerto y la configuración TLS del servidor; el resultado dice qué respondió el servidor.
Fija el estado en error.
Solo intercambio de claves heredado legacy_kex_only
El servidor solo completa un handshake con intercambio de claves heredado, que muchos clientes actuales ya no ofrecen. Active conjuntos de cifrado ECDHE.
Fija el estado en advertencia.
Se negocia TLS 1.1 o anterior legacy_protocol
El servidor negocia TLS 1.1 o anterior, que los navegadores actuales rechazan. Active TLS 1.2 y 1.3.
Fija el estado en error.
Dirección privada o reservada blocked_target
El host se resuelve en una dirección privada o reservada, a la que las comprobaciones no se conectan. Revise el nombre de host, o supervise el servicio desde su propia red.
Fija el estado en error.
Sin respuesta TLS unreachable
Tres intentos no obtuvieron respuesta TLS. El resultado es desconocido y no juzga nada; saber si el servidor está activo es tarea de una comprobación HTTP o de ping.
Deja el resultado como desconocido.
Versiones del protocolo
Acepta SSL 3 accepts_ssl3
El servidor aún responde a SSL 3, que está roto. Desactívelo. En nginx: ssl_protocols TLSv1.2 TLSv1.3; En Apache: SSLProtocol -all +TLSv1.2 +TLSv1.3.
Exigido por: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1), NCSC-NL (Table 1: Insufficient).
Acepta TLS 1.0 accepts_tls10
El servidor aún responde a TLS 1.0, que los navegadores actuales ya no usan. Desactívelo igual que SSL 3.
Exigido por: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1), NCSC-NL (Table 1: Insufficient).
Acepta TLS 1.1 accepts_tls11
El servidor aún responde a TLS 1.1, que los navegadores actuales ya no usan. Desactívelo igual que SSL 3.
Exigido por: Mozilla (tls_versions), BSI (§3.2), NIST (§3.1 (should not)), NCSC-NL (Table 1: Insufficient).
Acepta TLS 1.2 después de su fecha accepts_tls12
El servidor acepta TLS 1.2 más allá de la fecha en que lo permite la referencia. Prevea servir solo TLS 1.3 en cuanto sus clientes lo permitan.
Exigido por: BSI (§3.2 Table 2 (TLS 1.2 up to 2031)).
Sin TLS 1.3 no_tls13
El servidor no negocia TLS 1.3. Actívelo; es más rápido y deja fuera todo lo débil por diseño. Todo software de servidor actual lo admite.
Exigido por: NIST (§3.1).
No tolera versiones de TLS más nuevas version_intolerant
El servidor aborta un handshake que ofrece una versión de TLS más nueva que la suya en lugar de negociar una anterior. Esto rompe clientes a medida que llegan versiones; actualice el software del servidor o el equipo situado delante de él.
Exigido por: NIST (§3.1).
Conjuntos de cifrado
Acepta cifrados nulos accepts_null
El servidor acepta conjuntos de cifrado que no cifran nada. Quítelos de su lista de cifrados.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Tables 6, 8: Insufficient).
Acepta intercambio de claves anónimo accepts_anon
El servidor acepta intercambio de claves anónimo, que cualquiera en el camino puede interceptar. Quite esos conjuntos.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 2: Insufficient).
Acepta cifrados de exportación accepts_export
El servidor acepta conjuntos de exportación, que están rotos. Quítelos.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 2: Insufficient).
Acepta RC4 accepts_rc4
El servidor acepta RC4, que está roto. Quítelo de la lista de cifrados.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1), NCSC-NL (Table 8: Insufficient).
Acepta DES o 3DES accepts_3des
El servidor acepta DES o 3DES, demasiado débiles. Quítelos de la lista de cifrados.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1.1), NCSC-NL (Table 8: Insufficient).
Intercambio de claves sin forward secrecy accepts_static_kex
El servidor acepta intercambio de claves sin forward secrecy, así que una clave robada más tarde descifra el tráfico pasado. Ofrezca solo conjuntos ECDHE (y TLS 1.3).
Exigido por: Mozilla (ciphers), BSI (RSA key transport, not in Tables 3–5; §3.3.1.2 Table 4 (up to 2026)), NCSC-NL (Table 6: Insufficient).
Acepta conjuntos CBC con MAC SHA-1 accepts_sha1_mac
El servidor acepta conjuntos CBC con SHA-1 para autenticar mensajes. Prefiera conjuntos AES-GCM y ChaCha20 y quite estos.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NCSC-NL (Table 9: Insufficient).
Acepta conjuntos CBC accepts_cbc
El servidor acepta conjuntos CBC, con un largo historial de ataques de relleno. Ofrezca solo conjuntos AEAD (AES-GCM, ChaCha20).
Exigido por: Mozilla (ciphers), NCSC-NL (Table 8: To be phased out).
Acepta conjuntos DHE de campo finito accepts_dhe
El servidor acepta conjuntos DHE de cuerpo finito, que son lentos y se están retirando. Ofrezca conjuntos ECDHE en su lugar.
Exigido por: Mozilla (ciphers), BSI (§3.3.1.1 Table 3 (TLS 1.2 DHE up to 2029)), NCSC-NL (Table 6: To be phased out).
Conjuntos de TLS 1.2 fuera de la referencia suite_not_allowed
El servidor acepta conjuntos TLS 1.2 que la referencia no enumera, como ChaCha20, CCM, Camellia o ARIA según la referencia. El hallazgo los nombra; quítelos si la referencia le importa.
Exigido por: Mozilla (ciphers), BSI (not in Tables 3–5), NIST (§3.3.1.1), NCSC-NL (Table 8: Insufficient).
Conjuntos de TLS 1.3 fuera de la referencia tls13_suite_not_allowed
El servidor acepta conjuntos TLS 1.3 que la referencia no enumera: ChaCha20 para BSI y NIST, los conjuntos CCM para Mozilla y NCSC-NL. En servidores basados en OpenSSL los conjuntos TLS 1.3 se fijan aparte, por ejemplo con ssl_conf_command Ciphersuites en nginx.
Exigido por: Mozilla (ciphersuites), BSI (§3.4.4 Table 13), NIST (§3.3.1.2), NCSC-NL (Table 8: Insufficient).
Intercambio de claves
Grupos de intercambio de claves fuera de la referencia kex_group_not_allowed
El servidor acepta grupos de intercambio de claves que la referencia no enumera, como X25519 con BSI o NIST. Fije los grupos expresamente: ssl_ecdh_curve en nginx, SSLOpenSSLConfCmd Curves en Apache.
Exigido por: Mozilla (tls_curves), BSI (§3.3.2 Table 6, §3.4.2 Table 10), NIST (§3.3.1, §3.4.2.2), NCSC-NL (Tables 3, 6, 7: Insufficient).
Falta el grupo de intercambio de claves exigido no_required_kex_group
El servidor no negocia ninguno de los grupos que exige la referencia, P-256 o P-384 en NIST. Añada uno de ellos a los grupos del servidor.
Exigido por: BSI (§3.3.2 Table 6, §3.4.2 Table 10), NIST (§3.4.2.2).
Sin intercambio de claves híbrido poscuántico no_pq_hybrid
El servidor no negocia ningún intercambio de claves híbrido poscuántico, que la referencia espera desde su fecha. Las versiones actuales de OpenSSL y BoringSSL ofrecen uno.
Exigido por: BSI (§3.1.3 (classical key agreement alone up to 2031)).
Grupo DH débil weak_dh
El grupo DH del servidor es más pequeño de lo que permite la referencia, o no es uno de los grupos estándar del RFC 7919. Use un grupo estándar de al menos el tamaño indicado, o prescinda de DHE.
Exigido por: Mozilla (dh_param_size), BSI (§3.6.1 Table 14), NIST (§3.3.1, §3.3.3), NCSC-NL (Table 7: Insufficient).
Handshake
Compresión TLS activada tls_compression
El servidor acepta compresión a nivel TLS, que filtra secretos (CRIME). Desactívela.
Exigido por: BSI (§3.3.4.3), NIST (§3.7), NCSC-NL (Table 10: Insufficient).
Sin renegociación segura insecure_renegotiation
El servidor no admite la renegociación segura (RFC 5746). Actualice la biblioteca TLS; toda biblioteca mantenida la admite.
Exigido por: BSI (§3.3.4.1), NIST (§3.4.1.1), NCSC-NL (Table 11: Insufficient).
Extensión Heartbeat activada heartbeat_enabled
El servidor negocia la extensión Heartbeat, la que aprovechó Heartbleed. Solo se informa, nunca se pone a prueba; desactívela.
Exigido por: BSI (§3.3.4.6).
HMAC truncado activado truncated_hmac
El servidor negocia HMAC truncado, que debilita la integridad. Desactívelo.
Exigido por: BSI (§3.3.4.2), NIST (§3.4.2 item 8).
Sin Extended Master Secret no_extended_master_secret
El servidor no negocia Extended Master Secret (RFC 7627). Actualice la biblioteca TLS o actívelo.
Exigido por: BSI (§3.3.4.7), NIST (§3.4.1.3).
CBC sin Encrypt-then-MAC cbc_without_etm
El servidor usa conjuntos CBC sin Encrypt-then-MAC (RFC 7366). Actívelo, o mejor, prescinda de los conjuntos CBC.
Exigido por: BSI (§3.3.4.5), NIST (§3.4.2.7).
Degradación no impedida (TLS_FALLBACK_SCSV) no_fallback_scsv
El servidor acepta un handshake degradado pese a TLS_FALLBACK_SCSV, así que un atacante puede empujar a los clientes a una versión anterior. Actualice la biblioteca TLS o desactive las versiones antiguas.
Exigido por: NIST (§3.4.2.1).
Handshake firmado con RSA PKCS #1 v1.5 pkcs1_handshake_signature
Si solo se le ofrecen firmas RSA PKCS #1 v1.5, el servidor firma con una su intercambio de claves. Algunas referencias quieren RSA-PSS; las bibliotecas actuales lo prefieren cuando los clientes lo ofrecen.
Exigido por: BSI (§3.3.3 Table 7 (rsa up to 2025)).
Handshake firmado con SHA-1 weak_handshake_hash
Si solo se le ofrece SHA-1, el servidor firma con él su intercambio de claves. Limite los algoritmos de firma a SHA-256 o más fuertes.
Exigido por: BSI (§3.3.3 Table 8), NIST (§3.3.3), NCSC-NL (Table 9: Insufficient).
Certificado
Clave del certificado demasiado corta weak_key
La clave del certificado es más pequeña de lo que permite la referencia. Emita el próximo certificado con una clave mayor, o uno ECDSA.
Exigido por: Mozilla (certificate_curves; rsa_key_size), BSI (§3.6.1 Table 14), NIST (§3.2.1 Table 3-1, §3.3.3), NCSC-NL (Table 3: Insufficient; Table 4: Insufficient).
Clave de un certificado intermedio demasiado corta weak_chain_key
La clave de un certificado intermedio es más pequeña de lo que permite la referencia. El intermedio viene de su CA; pida una cadena con uno más fuerte o cambie de CA.
Exigido por: BSI (§3.6), NIST (§3.3.3).
Firma MD5 o SHA-1 en la cadena weak_signature
Un certificado de la cadena está firmado con MD5 o SHA-1. Pida que lo vuelvan a emitir; si es el intermedio, su CA tiene uno actual.
Exigido por: Mozilla (certificate_signatures), BSI (§3.3.3 Table 8, §3.4.3 Table 12), NIST (§3.3.3), NCSC-NL (Table 9: Insufficient).
Firma RSA PKCS #1 v1.5 en la cadena pkcs1_signature
Un certificado de la cadena está firmado con RSA PKCS #1 v1.5, que algunas referencias ya no recomiendan. Cumplirlas en la práctica significa una cadena ECDSA.
Exigido por: BSI (§3.3.3 Table 7, §3.4.3 Table 12 (up to 2025)).
Tipo de clave fuera de la referencia cert_type_not_allowed
El tipo de clave del certificado está fuera de la referencia, como DSA o EdDSA. Emita un certificado RSA o ECDSA.
Exigido por: Mozilla (certificate_types), BSI (§3.3.3 Table 7), NIST (§3.2), NCSC-NL (Table 2: Insufficient).
Curva fuera de la referencia curve_not_allowed
La curva del certificado está fuera de la referencia. Emítalo con P-256 o P-384.
Exigido por: Mozilla (certificate_curves), BSI (§3.6.2), NIST (§3.2, Table 3-1), NCSC-NL (Tables 3, 5: Insufficient).
Certificado válido durante demasiado tiempo long_lifespan
El certificado es válido durante más tiempo del que permite la referencia. Emita certificados de vida más corta, idealmente renovados de forma automática.
Exigido por: Mozilla (maximum_certificate_lifespan), NIST (Table 3-1).
Nombre comodín en el certificado wildcard
El certificado cubre un nombre comodín. Todos los hosts que cubre comparten la clave, así que un host comprometido los expone a todos. Prefiera certificados para hosts con nombre.
Exigido por: BSI (TR-02103 (1.0) §4.1.2).
Sin extensión Key Usage no_key_usage
El certificado no tiene la extensión Key Usage. Pida a su CA un certificado que la incluya.
Exigido por: BSI (TR-02103 (1.0) Table 30), NIST (Table 3-1).
Key Usage no marcada como crítica key_usage_not_critical
El Key Usage del certificado no está marcado como crítico. Pida a su CA uno que lo marque.
Exigido por: BSI (TR-02103 (1.0) Table 34), NIST (Table 3-1).
Key Usage no encaja con el intercambio de claves key_usage_mismatch
El Key Usage del certificado no permite el intercambio de claves que usa el servidor, por ejemplo transporte de claves RSA con una clave solo de firma. Quite los conjuntos de transporte de claves RSA, o vuelva a emitir el certificado.
Exigido por: BSI (TR-02103 (1.0) §4.1.3), NIST (Table 3-1).
Sin Extended Key Usage no_server_auth_eku
El certificado no tiene Extended Key Usage. Pida a su CA uno que indique autenticación de servidor TLS.
Exigido por: BSI (TR-02103 (1.0) §4.1.4), NIST (Table 3-1).
Extended Key Usage permite cualquier uso eku_any_purpose
El Extended Key Usage del certificado permite cualquier propósito. Pida a su CA uno limitado a la autenticación de servidor TLS.
Exigido por: NIST (Table 3-1).
Sin Authority Key Identifier no_aki
El certificado no tiene Authority Key Identifier, que ayuda a los clientes a construir la cadena. Pida a su CA un certificado que lo tenga.
Exigido por: BSI (TR-02103 (1.0) Table 30), NIST (Table 3-1).
Sin respondedor OCSP no_ocsp_responder
El certificado no indica ningún respondedor OCSP. Muchas CA han dejado de ofrecer OCSP, así que solo es un hallazgo donde una referencia lo exige.
Exigido por: NIST (§3.2, Table 3-1).
DNS
Sin registros CAA no_caa
El nombre no tiene registros CAA, así que cualquier CA puede emitir certificados para él. Publique un registro CAA con las CA que usa.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Sin Encrypted Client Hello no_ech
El registro DNS HTTPS del nombre no anuncia Encrypted Client Hello. Solo se registra; nunca cuesta un candado, porque depende tanto de su CDN como de usted.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Revocación
Sin grapado OCSP no_ocsp_stapling
El certificado indica un respondedor OCSP y el servidor no grapa ninguna respuesta, así que cada cliente tiene que preguntar a la CA. En nginx: ssl_stapling on; En Apache: SSLUseStapling on.
Exigido por: Mozilla (ocsp_staple), NIST (§3.4.1.5).
HTTP
Sin cabecera HSTS no_hsts
La respuesta HTTPS no incluye la cabecera Strict-Transport-Security, así que un navegador que llega por HTTP sin cifrar, porque se escribió la dirección o se siguió un enlace antiguo, puede ser interceptado antes de alcanzar HTTPS. Envíe la cabecera en todas las respuestas HTTPS. En nginx: add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
Exigido por: Mozilla (hsts_min_age).
max-age de HSTS demasiado corto short_hsts
El max-age de HSTS es más corto de lo exigido: dos años según Mozilla, un año para el quinto candado. Los navegadores recuerdan la cabecera durante ese tiempo, así que auméntelo cuando HTTPS funcione en todo el nombre.
Exigido por: Mozilla (hsts_min_age).
HSTS deja fuera los subdominios hsts_no_subdomains
La cabecera HSTS deja fuera los subdominios, de modo que un subdominio al que se llega por HTTP sin cifrar todavía puede fijar cookies para todo el dominio. Añada includeSubDomains cuando todos los subdominios sirvan HTTPS.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Sin redirección a HTTPS no_https_redirect
El puerto 80 responde sin enviar a los visitantes a HTTPS en el mismo nombre: sirve la página por HTTP sin cifrar, redirige a HTTP o redirige primero a otro nombre. Redirija cada petición HTTP a https:// en el mismo nombre; el cambio a otro nombre viene después, ya por HTTPS. Un puerto 80 cerrado no es un hallazgo.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Redirección a HTTPS no permanente redirect_not_permanent
El puerto 80 redirige a HTTPS con un estado temporal (302, 303 o 307), así que navegadores y buscadores siguen volviendo por HTTP sin cifrar. Use 301 o 308. En nginx: return 301 https://$host$request_uri;
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Cookies sin Secure insecure_cookie
La respuesta HTTPS fija cookies sin el atributo Secure, así que el navegador también las envía por HTTP sin cifrar, donde cualquiera en el camino puede leerlas. Ponga Secure en todas las cookies; el hallazgo las nombra. Sus valores nunca se guardan.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Cabeceras de pinning obsoletas obsolete_pinning
La respuesta incluye Public-Key-Pins o Expect-CT. Los navegadores abandonaron ambas hace años, y una cabecera de pines olvidada aún puede dejar fuera a un cliente que la respete. Elimínelas: los navegadores exigen Certificate Transparency sin la cabecera, y una app móvil fija las claves en su propio código.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.
Cobertura de los sondeos
Prueba de configuración incompleta posture_incomplete
La prueba diaria de configuración no pudo determinarlo todo: un sondeo no se envió o no obtuvo respuesta, el servidor aceptó más suites de cifrado de las que la prueba enumera, o un certificado era demasiado grande para guardarlo. Ninguna referencia se da por cumplida en lo que la prueba no vio, así que la calificación se queda en tres candados mientras afecte a una referencia elegida, y por debajo de cinco en otro caso. Suele resolverse con la prueba del día siguiente; si persiste, compruebe que el servidor responde a todas las conexiones en lugar de descartar algunas. Con las comprobaciones HTTP activas, una petición HTTPS sin respuesta cuenta igual; desactívelas en un puerto que no sirva HTTP.
No lo exige ninguna referencia: solo se registra y cuenta para la calificación.