Le symptôme
Un serveur reçoit un nouveau certificat, par exemple lors du renouvellement annuel. Le navigateur du PC ne signale rien. Mais sur les appareils sous Android 13 ou antérieur, les applis, les web views intégrées ou les applis mail coupent la connexion. Messages typiques :
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. javax.net.ssl.SSLHandshakeException: … Trust anchor for certification path not found.
Des navigateurs comme Firefox embarquent leur propre liste d’AC racines et fonctionnent donc parfois quand même. Le diagnostic en devient déroutant : l’erreur n’apparaît pas partout, seulement dans les applis qui utilisent le magasin de certificats du système.
La cause : une AC racine inconnue d’Android 13
Les autorités de certification émettent de plus en plus sous de nouvelles racines. Chez GlobalSign, il s’agit de GlobalSign Root R46 (RSA) et E46 (ECC). Ces racines ne figurent dans le magasin système qu’à partir d’Android 14 (octobre 2023). Android 13 et antérieur ne les connaissent pas. Il en va de même pour d’autres racines récentes comme ISRG Root X2, DigiCert TLS RSA4096 Root G5 ou les racines HARICA de 2021.
La chaîne d’un certificat serveur ressemble alors à ceci :
www.exemple.fr (certificat serveur)
└─ GlobalSign … CA (intermédiaire)
└─ GlobalSign Root R46 ← inconnue d’Android 13
Pourquoi envoyer l’AC racine ne sert à rien
L’idée évidente serait d’ajouter la racine R46 au fichier de certificats. Cela ne change rien : un client ne fait confiance qu’à une AC racine présente dans son propre magasin. Une racine envoyée par le serveur n’est jamais acceptée comme ancre de confiance, sinon n’importe quel serveur pourrait se certifier lui-même. Installer la racine à la main sur l’appareil n’aide pas non plus la plupart des applis : depuis Android 7, les applis ne font par défaut pas confiance aux certificats installés par l’utilisateur.
La solution : un certificat croisé
Un certificat croisé contient la même AC, avec le même nom et la même clé que la racine R46, mais il est signé par une racine plus ancienne que les vieux appareils connaissent aussi. Pour R46, il existe entre autres un certificat croisé de GlobalSign Root CA – R3. Si le serveur envoie ce certificat croisé, les anciens appareils disposent d’un chemin valide :
www.exemple.fr
└─ GlobalSign … CA
└─ GlobalSign Root R46 (croisé, signé par R3)
└─ GlobalSign Root CA – R3 ← présente aussi sous Android 13
Les appareils récents connaissent R46 et s’arrêtent là. Les anciens vont une étape plus loin jusqu’à R3. Les deux font confiance à la connexion, sans aucune modification du certificat serveur.
Étape par étape
- Vérifier : saisir le serveur dans la vérification SSL. La section « Anciens appareils » avertit que la chaîne se termine par une racine présente seulement à partir d’Android 14.
- Réparer : cliquer sur « Réparer dans le convertisseur ». Le convertisseur de certificats reprend la chaîne et propose le certificat croisé adapté issu de la CCADB de Mozilla.
- Exporter : ajouter la clé privée et choisir le format du serveur, p. ex. un bundle PEM pour nginx ou un fichier PFX pour IIS.
- Installer : avec nginx,
ssl_certificatepointe vers le nouveau fichier dans l’ordre certificat serveur → intermédiaire → certificat croisé. Puis recharger le service. - Revérifier : la vérification SSL doit maintenant afficher « Anciens appareils » en vert.
server {
listen 443 ssl;
server_name www.exemple.fr;
ssl_certificate /etc/ssl/exemple/fullchain-cross.pem; # serveur + intermédiaire + croisé
ssl_certificate_key /etc/ssl/exemple/server.key;
}
Bon à savoir
- Le certificat croisé a sa propre date d’expiration ; celui de R3 court jusqu’en mars 2029. D’ici là, il ne devrait plus guère rester d’appareils sous Android 13.
- Il faut renvoyer le certificat croisé à chaque renouvellement. Après le changement, la vérification SSL montre si cela a fonctionné.
- Les quelque 1,5 Ko supplémentaires par connexion ne comptent pas en pratique.
FAQ
Cela ne concerne-t-il que GlobalSign ?
Non. Toute chaîne qui se termine par une racine présente seulement à partir d’Android 14 est concernée, par exemple ISRG Root X2 ou DigiCert TLS RSA4096 Root G5. La vérification SSL le détecte automatiquement.
Puis-je installer la racine R46 sur le téléphone ?
Pour ton propre navigateur oui, pour la plupart des applis non : depuis Android 7, les applis ne font confiance qu’au magasin système, pas aux certificats installés par l’utilisateur. Pour les appareils des clients, ce n’est de toute façon pas une solution.
Le certificat croisé gêne-t-il les appareils récents ?
Non. Les appareils récents connaissent R46 et s’arrêtent là ; ils n’ont simplement pas besoin du certificat croisé.