J'ai une autorité de certification racine (airgapped, openssl) que j'utilise pour de nombreux projets de laboratoire internes.
Dans le passé, j'ai simplement importé le certificat de l'autorité de certification dans le magasin des informations d'identification de l'utilisateur sur Android et le système a commencé à lui faire confiance immédiatement.
Je viens d'effacer mon téléphone et maintenant, sous Android 11, je suis incapable d'obtenir cette autorité de certification racine de confiance comme avant.
Le certificat de l'autorité de certification comporte bien l'extension CA:TRUE :
$ openssl x509 -in root.crt -noout -text|grep -B2 TRUE
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Le certificat du serveur présenté dans l'échange SSL correspond au nom DNS et inclut également le même nom dans l'extension SAN :
(...)
Issuer: O = <domain> Lab Root CA, emailAddress = <me>, L = <Place>, ST = <state>, C = US, CN = <domain> Lab Root CA
Validity
Not Before: Aug 13 11:39:55 2020 GMT
Not After : Aug 13 11:39:55 2023 GMT
Subject: C = US, ST = <state>, CN = <lab server name>
(....)
X509v3 Subject Alternative Name:
DNS:<lab server name>
Le serveur avec lequel je fais mes tests enchaîne correctement le certificat dans la réponse TLS, et cette configuration fonctionne parfaitement sur un grand nombre de navigateurs et de combinaisons d'OS dans le monde des ordinateurs de bureau (et fonctionnait jusqu'à récemment sur Android).
J'ai essayé ce qui suit :
-
Importez le certificat de l'autorité de certification racine en utilisant la méthode normale "Importer depuis la carte SD". L'AC s'importe correctement, mais Chrome émet toujours des avertissements de navigateur d'autorité invalide.
-
(Rooted) déplacer le cert importé de l'utilisateur
/data/misc/user/0/cacerts-added
dossier d'accréditation importé vers/system/etc/security/cacerts
. L'autorité de certification apparaît correctement dans l'onglet "Système" de Trusted Credentials, mais ne fonctionne toujours pas dans Chrome. -
Créer manuellement le fichier encodé en DER dans le dossier System cacerts. Chrome ne fonctionne toujours pas.
-
En suivant l'exemple de certains certificats de confiance PEM-encodés déjà présents sur le système, j'ai créé le mien et l'ai placé dans System cacerts. Chrome ne fonctionne toujours pas.
-
J'ai essayé d'utiliser un module Magisk pour déplacer les certificats de confiance de l'utilisateur vers le magasin du système. Ce module a fonctionné comme décrit, et a déplacé mon autorité de certification racine dans l'onglet Système, mais Chrome ne veut toujours pas faire confiance pour SSL et continue de donner des avertissements au navigateur.
Quelques autres observations :
- Running
curl -vv https://<testurl>
via adb se plaint constamment deSSL certificate problem: self signed certificate in certificate chain
même si l'autorité de certification par laquelle le certificat est signé se trouve dans le magasin de certificats de confiance. - La chaîne de confiance de l'autorité de certification fonctionne bien dans les navigateurs de bureau, et par l'intermédiaire de l'autorité de certification de l'État.
openssl s_client
sur un bureau (Verify return code: 0 (ok)
lorsque l'AC racine est importée dans la confiance du bureau). - J'ai effacé le stockage des applications de Chrome chaque fois que je vais tester après avoir fait un changement. Rien à faire.
Y a-t-il autre chose que je puisse essayer ou un paramètre que j'ai oublié ? C'est très ennuyeux de ne pas pouvoir gérer les autorités de certification racine de confiance sur Android 11 comme je le faisais auparavant.
Je préférerais ne pas avoir à modifier l'autorité de certification SSL complète que j'ai mise en place pour quelque chose comme Let's Encrypt juste pour des raisons de compatibilité avec Android, alors ne suggérez pas cette solution comme alternative. Il y a beaucoup de points d'extrémité internes dans ce laboratoire et mon fournisseur de DNS public ne prend pas en charge l'automatisation pour dns-01 ACME, ce serait donc très pénible d'utiliser un proxy et de jongler avec ces certificats.
Voici un exemple de ce à quoi ressemble l'un des certificats du serveur :
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 4123 (0x101b)
Signature Algorithm: sha256WithRSAEncryption
Issuer: O = <domain> Lab Root CA, emailAddress = <me>, L = <city>, ST = <state>, C = US, CN = <domain> Lab Root CA
Validity
Not Before: Dec 23 13:06:42 2021 GMT
Not After : Dec 22 13:06:42 2024 GMT
Subject: C = US, ST = <state>, CN = monitoring.lab.<domain>
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
(...)
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Server Certificate
X509v3 Subject Key Identifier:
(...)
X509v3 Authority Key Identifier:
keyid:(...)
DirName:/O=<domain> Lab Root CA/emailAddress=<me>/L=<city>/ST=<state>/C=US/CN=<domain> Lab Root CA
serial:(...)
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Subject Alternative Name:
DNS:monitoring.lab.<domain>
Signature Algorithm: sha256WithRSAEncryption
(snip)