3 votos

¿Cómo puedo importar una CA root en la que confíe Chrome en Android 11?

Tengo una CA root (airgapped, openssl) que utilizo para muchos proyectos internos de laboratorio.

En el pasado, simplemente he importado el certificado de CA en el almacén de credenciales de usuario en Android y el sistema comenzó a confiar en él inmediatamente.

Acabo de borrar mi teléfono y ahora, en Android 11, soy incapaz de conseguir que este Root CA sea de confianza como lo era antes.

El certificado CA definitivamente tiene la extensión CA:TRUE:

$ openssl x509 -in root.crt -noout -text|grep -B2 TRUE
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:TRUE

El certificado del servidor que se presenta en el intercambio SSL coincide con el nombre DNS y también incluye el mismo nombre en la extensión 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>

El servidor con el que estoy probando encadena correctamente el cert en la respuesta TLS, y esta configuración funciona perfectamente en un montón de navegadores y combinaciones de SO en el mundo del escritorio (y funcionaba hasta hace poco en Android).

He probado lo siguiente:

  • Importa el certificado de la CA root mediante el método normal de "Importar desde la tarjeta SD". La CA se importa correctamente, pero Chrome sigue dando advertencias de navegador de autoridad no válida.

  • (Rooted) moviendo el cert importado del usuario /data/misc/user/0/cacerts-added carpeta de credenciales importadas a /system/etc/security/cacerts . La CA aparece correctamente en la pestaña "Sistema" de Credenciales de confianza, pero sigue sin funcionar en chrome

  • Empaquetar manualmente el archivo codificado con DER en la carpeta System cacerts. Chrome sigue sin funcionar.

  • Siguiendo el ejemplo de algunos certificados de CA de confianza codificados en PEM que ya están en el sistema, he creado el mío propio y lo he puesto en System cacerts. Chrome sigue sin funcionar.

  • Intenté usar un módulo de Magisk para mover los certificados de confianza del usuario al almacén del sistema. Este módulo funcionó como se describió, y movió mi CA root a la pestaña Sistema, pero Chrome todavía no quería confiar para SSL y sigue dando advertencias del navegador.

Algunas otras observaciones:

  • Corriendo curl -vv https://<testurl> a través de adb se queja constantemente de SSL certificate problem: self signed certificate in certificate chain aunque la CA que firma el certificado esté en el almacén de credenciales de confianza.
  • La cadena de confianza de la CA definitivamente funciona bien en los navegadores de escritorio, y a través de openssl s_client en un escritorio ( Verify return code: 0 (ok) cuando la CA root se importa a la confianza del escritorio)
  • He borrado el almacenamiento de aplicaciones de Chrome cada vez que voy a probar después de hacer un cambio. No hay resultados.

¿Hay algo más que pueda probar o algún ajuste que se me haya escapado? Es muy molesto no poder gestionar las CAs Root de confianza en Android 11 como solía hacer.

Preferiría no tener que turbar toda la CA SSL completa que he configurado para algo como Let's Encrypt sólo por la compatibilidad con Android, así que por favor no sugieras eso como una alternativa. Hay muchos puntos finales internos en este laboratorio y mi proveedor de DNS público no admite la automatización para dns-01 ACME, por lo que sería un gran dolor de cabeza hacer proxy y malabares con estos certificados.

Aquí hay una muestra del aspecto de uno de los certificados del servidor:

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 Puntos 353

El error indica que el certificado de la CA root es la causa, pero su certificado del servidor también parece "defectuoso", ya que su período de validez es demasiado largo. La mayoría de los navegadores no aceptan períodos de validez superiores a 13 meses. La extensión del nombre alternativo del sujeto está presente, por lo que no debería causar problemas (esta extensión es ahora obligatoria).

Para el Root CA cert no sé qué extensión se requiere realmente sólo lo comparo con el creado por Fiddler (que sé que funciona):

Veo las siguientes extensiones:

  • Restricciones básicas X509v3 (2.5.29.19):
    • CA: VERDADERO
    • Restricción de la longitud de la ruta: 0
  • KeyUsage (2.5.29.15)
    • Firma de certificados
  • SubjectKeyIdentifier (2.5.29.14)
    • Identificador aleatorio de 20 bytes

Y, por supuesto, el algoritmo de firma debe ser sólo algoritmos seguros como RSA con una clave de al menos 2048 bits y SHA-256.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X