Guía de integración del controlador de restricción de depuración

Utilice las siguientes instrucciones para integrar el controlador de restricción de depuración (DRC) de AAOS.

Figura 1. Ejemplo de la aplicación DRC

Arquitectura

La arquitectura DRC se ilustra a continuación. Los componentes resaltados en rojo (Emisor de tokens y Controlador de restricciones de debut) tienen implementaciones de referencia adjuntas que puede personalizar.

Figura 2. Arquitectura DRC

¿Qué es la República Democrática del Congo?

La unidad principal del automóvil incluye la aplicación DRC (consulte la implementación de referencia en packages/apps/Car/DebuggingRestrictionController ). La aplicación de referencia incluye la lógica para recibir un token de acceso del emisor de tokens, validar el token y luego aplicar cambios de restricción de depuración como se especifica en el token. La lógica incluye elementos básicos de UX en el lado del automóvil.

¿Qué es el emisor de tokens?

Este es un servicio web que emite tokens de acceso firmados criptográficamente (consulte la implementación de referencia en packages/apps/Car/DebuggingRestrictionController/server ). El servicio web de referencia es una función desplegable de Firebase Cloud (para obtener más información, consulte Cloud Functions para Firebase ).

requisitos previos

Antes de implementar una implementación de referencia, asegúrese de completar las siguientes tareas.

Preparación de certificados para firmar tokens de acceso

El emisor de tokens genera firmas web JSON (JWS) como tokens de acceso. Para una compatibilidad óptima, el emisor de referencia solo admite el algoritmo RS256 (firmas RSA con SHA256). Para facilitar la rotación de claves, utilice una cadena de certificados en lugar de un solo certificado para firmar tokens de acceso. Una cadena de certificados típica debe constar de un certificado de CA raíz, un certificado de CA intermedio y un certificado de entidad final.

El certificado de entidad final que firma los tokens JWS no es diferente de un certificado TLS estándar. Puede comprar un certificado de CA públicas como DigiCert o mantener su propia cadena de certificados utilizando certificados de CA raíz autofirmados o módulos de seguridad de hardware. El certificado de la entidad final debe ser un certificado X509v3 con una extensión de nombre alternativo del sujeto (SAN). La extensión SAN contiene un identificador (por ejemplo, nombre de host) del emisor del token. Por último, se deben preferir los certificados RSA a los certificados EC porque el emisor del token solo admite RS256.

Google proporciona un script de shell para generar certificados autofirmados en packages/apps/Car/DebuggingRestrictionController/server/genkey.sh .

Configuración de base de fuego

El emisor de tokens de referencia usa Firebase Authentication y Firebase Cloud Function .

Para configurar su cuenta de Firebase:

  1. Para crear un proyecto de Firebase, consulte Agregar Firebase a su proyecto de Android .
  2. Para habilitar algunos autenticadores de Firebase, consulte ¿Por dónde empiezo con la autenticación de Firebase? .
  3. Para agregar una función de Firebase Cloud vacía, consulte Primeros pasos .
  4. Si aún no lo ha hecho, instale Node.js, NPM y Firebase Tools para compilar e implementar el emisor de tokens.

Integración de la aplicación DRC

La aplicación DRC de referencia se encuentra en packages/apps/Car/DebuggingRestrictionController . La aplicación se puede compilar empaquetada en AOSP con Soong o desagregada con Gradle .

compilación incluida

Para compilar una aplicación empaquetada:

  1. Copie applicationId , projectId y apiKey de google-services.json en packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java . Hacerlo permite que la aplicación DRC se conecte correctamente a Firebase.
  2. Actualice estas constantes en packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java :
    • TOKEN_USES_SELF_SIGNED_CA indica si se utilizan certificados de CA raíz autofirmados. Si está habilitada, la aplicación DRC solo confía en el certificado de CA raíz con codificación PEM especificado en ROOT_CA_CERT .
    • TOKEN_ISSUER_API_NAME es el nombre de la función de Firebase Cloud y debe coincidir con la función de Cloud que creó anteriormente en Firebase Console.
    • TOKEN_ISSUER_HOSTNAME debe coincidir con el nombre alternativo del sujeto en el certificado de la entidad final que firmará los tokens de acceso.
    • DRC_TEST_EMAIL y DRC_TEST_PASSWORD son credenciales para una cuenta de prueba opcional, que se puede aprovisionar previamente en Firebase si ha habilitado el inicio de sesión con correo electrónico/contraseña. Estos se utilizan solo para pruebas instrumentadas.

La aplicación ahora está configurada para usar su cuenta de Firebase y sus certificados. En Android 9 y superior, debe configurar la lista de permitidos de permisos privilegiados . La lista de permitidos debe contener al menos android.permission.MANAGE_USERS . Por ejemplo:

<permissions>
  <privapp-permissions package="com.android.car.debuggingrestrictioncontroller">
    <permission name="android.permission.INTERNET"/>
    <permission name="android.permission.MANAGE_USERS"/>
  </privapp-permissions>
</permissions>

Compilación desagregada

Las compilaciones DRC desagregadas usan Gradle para compilar la aplicación.

Para crear una compilación desagregada:

  1. Confirme que ha instalado el SDK de Android.
  2. Cree un archivo de texto llamado local.properties en el directorio raíz de la aplicación.
  3. Establecer la ubicación del SDK de Android:
     sdk.dir=path/to/android/sdk
    
  4. Para configurar Firebase, copie google-services.json en packages/apps/Car/DebuggingRestrictionController/app . Gradle analiza el archivo y configura automáticamente el resto.
  5. Defina las variables de entorno. Al igual que con las compilaciones empaquetadas, debe especificar:
    • $TOKEN_USES_SELF_SIGNED_CA : verdadero o falso;
    • $ROOT_CA_CERT : ruta al certificado de CA raíz con codificación PEM;
    • $TOKEN_ISSUER_API_NAME : nombre de la función de Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME : SAN en el certificado;
    • $DRC_TEST_EMAIL y $DRC_TEST_EMAI L: credenciales para una cuenta de prueba, compilaciones de depuración únicamente.
  6. Para compilar la aplicación con Gradle, ejecute un comando como este:
    $ ./gradlew build
    

Integración del emisor de tokens

El emisor de tokens de referencia es una función de nube de Firebase implementada en Node.js. La función solo puede ser llamada por un usuario autenticado. Antes de implementar la aplicación, debe configurar la clave privada y los certificados utilizados para firmar los tokens JWS.

  1. Rellene un archivo JSON con el siguiente contenido:
    {
        "key": "---BEGIN PRIVATE KEY---\nRSA_PRIVATE_KEY\n-----END PRIVATE KEY-----\n",
        "certificates.0": "-----BEGIN CERTIFICATE-----\nTOKEN_SIGNING_CERT\n-----END CERTIFICATE-----\n",
        "certificates.1": "-----BEGIN CERTIFICATE-----\nINTERMEDIATE_CA_CERT\n-----END CERTIFICATE-----\n",
        "certificates.2": "-----BEGIN CERTIFICATE-----\nROOT_CA_CERT\n-----END CERTIFICATE-----\n",
        "expiration": "30m",
        "issuer": "Debugging Access Token Issuer",
        "audience": "IHU"
    }
    

    Los certificados se ordenan con el certificado de entidad final primero y el certificado de CA raíz al final. El período de caducidad es personalizable y se puede establecer en una duración más larga si un token emitido tarda algún tiempo antes de que una aplicación de DRC pueda recibirlo y consumirlo. No se admite la revocación de tokens.

  2. Sube la configuración a Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Implementa la función Firebase Cloud:
  5. $ firebase deploy --only functions
    
  6. Para administrar y monitorear su Emisor de tokens, consulte Administrar funciones de implementación y opciones de tiempo de ejecución .

Configuración de restricciones predeterminadas

Las restricciones predeterminadas se pueden aplicar antes del primer arranque. Haga esto con superposiciones de recursos estáticos para anular los valores predeterminados en el marco de trabajo de Android. Las restricciones se pueden aplicar respectivamente a diferentes tipos de usuarios. Para obtener información sobre los diferentes tipos de usuarios, consulte Compatibilidad con varios usuarios .

La restricción predeterminada para el usuario del sistema sin cabeza se puede configurar con la matriz de cadenas config_defaultFirstUserRestrictions en frameworks/base/core/res/res/values/config.xml . Establecer esta restricción deshabilita automáticamente Android Debug Bridge (ADB) hasta que se elimine la restricción, por ejemplo:

<string-array translatable="false" name="config_defaultFirstUserRestrictions">
  <item>no_debugging_features</item>
</string-array>

Las restricciones predeterminadas para usuarios habituales (por ejemplo, conductores y pasajeros) e invitados se pueden configurar en frameworks/base/core/res/res/xml/config_user_types.xml . Puede superponer estas cadenas para establecer las restricciones predeterminadas en cada tipo de usuario respectivamente, por ejemplo:

<user-types>
  <full-type name="android.os.usertype.full.SECONDARY" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
  <full-type name="android.os.usertype.full.GUEST" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
</user-types>