3 votes

Comment importer une autorité de certification racine reconnue par Chrome sur Android 11 ?

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 de SSL 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)

2voto

pr0nin Points 353

L'erreur indique que le certificat de l'autorité de certification racine est en cause, mais le certificat de votre serveur semble également "défectueux" car sa période de validité est trop longue. La plupart des navigateurs web n'acceptent pas les périodes de validité supérieures à 13 mois. L'extension Subject Alternative Name est présente donc cela ne devrait pas poser de problèmes (cette extension est maintenant obligatoire).

Pour le certificat de l'autorité de certification racine, je ne sais pas quelle extension est vraiment nécessaire, je le compare simplement à celui créé par Fiddler (qui, je le sais, fonctionne) :

Je vois les extensions suivantes :

  • Contraintes de base X509v3 (2.5.29.19) :
    • CA : VRAI
    • Contrainte de longueur de chemin : 0
  • KeyUsage (2.5.29.15)
    • Signature de certificat
  • SubjectKeyIdentifier (2.5.29.14)
    • Identifiant aléatoire de 20 octets

Et bien sûr, l'algorithme de signature ne doit être que des algorithmes sécurisés comme RSA avec une clé d'au moins 2048 bits et SHA-256.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X