El síntoma
Un servidor recibe un certificado nuevo, por ejemplo en la renovación anual. El navegador del PC no protesta. Pero en dispositivos con Android 13 o anteriores, las apps, las web views integradas o las apps de correo cortan la conexión. Mensajes típicos:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. javax.net.ssl.SSLHandshakeException: … Trust anchor for certification path not found.
Navegadores como Firefox traen su propia lista de CA raíz y por eso a veces funcionan igualmente. Eso confunde al buscar el fallo: el error no aparece en todas partes, solo en las apps que usan el almacén de certificados del sistema.
La causa: una CA raíz que Android 13 no conoce
Las autoridades de certificación emiten cada vez más bajo nuevas raíces. En GlobalSign se trata de GlobalSign Root R46 (RSA) y E46 (ECC). Estas raíces solo están en el almacén del sistema desde Android 14 (octubre de 2023). Android 13 y anteriores no las conocen. Lo mismo ocurre con otras raíces recientes, como ISRG Root X2, DigiCert TLS RSA4096 Root G5 o las raíces HARICA de 2021.
La cadena de un certificado de servidor queda entonces así:
www.ejemplo.es (certificado del servidor)
└─ GlobalSign … CA (intermedio)
└─ GlobalSign Root R46 ← desconocida en Android 13
Por qué no sirve enviar la CA raíz
Lo obvio sería añadir la raíz R46 al archivo de certificados. No cambia nada: un cliente solo confía en una CA raíz que esté en su propio almacén. Una raíz enviada por el servidor nunca se acepta como ancla de confianza; si no, cualquier servidor podría avalarse a sí mismo. Instalar la raíz a mano en el dispositivo tampoco ayuda a la mayoría de las apps: desde Android 7, las apps no confían por defecto en certificados instalados por el usuario.
La solución: un certificado cruzado
Un certificado cruzado contiene la misma CA, con el mismo nombre y la misma clave que la raíz R46, pero está firmado por una raíz más antigua que también conocen los dispositivos viejos. Para R46 existe, entre otros, un certificado cruzado de GlobalSign Root CA – R3. Si el servidor envía este certificado cruzado, los dispositivos antiguos tienen un camino válido:
www.ejemplo.es
└─ GlobalSign … CA
└─ GlobalSign Root R46 (cruzado, firmado por R3)
└─ GlobalSign Root CA – R3 ← presente también en Android 13
Los dispositivos nuevos conocen R46 y se detienen ahí. Los antiguos llegan un paso más allá, hasta R3. Ambos confían en la conexión sin cambiar nada del certificado del servidor.
Paso a paso
- Comprobar: introduce el servidor en el comprobador SSL. La sección «Dispositivos antiguos» avisa de que la cadena termina en una raíz que solo existe desde Android 14.
- Reparar: haz clic en «Reparar en el conversor». El conversor de certificados toma la cadena y ofrece el certificado cruzado adecuado de la CCADB de Mozilla.
- Exportar: añade la clave privada y elige el formato del servidor, p. ej. un bundle PEM para nginx o un archivo PFX para IIS.
- Instalar: en nginx,
ssl_certificateapunta al nuevo archivo con el orden certificado del servidor → intermedio → certificado cruzado. Después recarga el servicio. - Volver a comprobar: el comprobador SSL debería mostrar ahora «Dispositivos antiguos» en verde.
server {
listen 443 ssl;
server_name www.ejemplo.es;
ssl_certificate /etc/ssl/ejemplo/fullchain-cross.pem; # servidor + intermedio + cruzado
ssl_certificate_key /etc/ssl/ejemplo/server.key;
}
Conviene saber
- El certificado cruzado tiene su propia fecha de caducidad; el de R3 vale hasta marzo de 2029. Para entonces apenas quedarán dispositivos con Android 13 en uso.
- Hay que volver a enviar el certificado cruzado en cada renovación. Tras el cambio, el comprobador SSL muestra si ha funcionado.
- Los aproximadamente 1,5 KB adicionales por conexión no se notan en la práctica.
FAQ
¿Afecta solo a GlobalSign?
No. Afecta a toda cadena que termine en una raíz presente solo desde Android 14, por ejemplo ISRG Root X2 o DigiCert TLS RSA4096 Root G5. El comprobador SSL lo detecta automáticamente.
¿Puedo instalar la raíz R46 en el móvil?
Para tu propio navegador sí, para la mayoría de las apps no: desde Android 7 las apps solo confían en el almacén del sistema, no en certificados instalados por el usuario. Para los dispositivos de los clientes no es una solución en ningún caso.
¿Perjudica el certificado cruzado a los dispositivos nuevos?
No. Los dispositivos nuevos conocen R46 y se detienen ahí; simplemente no necesitan el certificado cruzado.