Error de certificado en Android 13: GlobalSign R46 y la solución con certificado cruzado

En el PC todo está en verde, pero en dispositivos Android antiguos las apps y las web views fallan con un error de certificado. Casi siempre la causa es una CA raíz que Android solo conoce desde la versión 14.

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

  1. 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.
  2. 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.
  3. 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.
  4. Instalar: en nginx, ssl_certificate apunta al nuevo archivo con el orden certificado del servidor → intermedio → certificado cruzado. Después recarga el servicio.
  5. 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

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.