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

Usa las instrucciones de esta página para integrar el controlador de restricción de depuración de AAOS RDC.

Figura 1: Ejemplo de la app de DRC.

Arquitectura

La arquitectura de la DRC se ilustra en la Figura 2. Componentes en rojo (entidad emisora del token y DRC) tienen implementaciones de referencia que puedes personalizar.

Figura 2: Arquitectura de la RDC.

¿Qué es la RDC?

La consola central del automóvil incluye la app de DRC (consulta la implementación de referencia en packages/apps/Car/DebuggingRestrictionController). La app de referencia incluye la lógica para recibir un token de acceso de la entidad emisora de tokens, validarlo y y, luego, aplicar cambios de restricción de depuración según lo especificado en el token. La lógica incluye los elementos básicos de UX del lado del automóvil.

¿Qué es la entidad emisora del token?

Este es un servicio web que emite tokens de acceso con firma criptográfica (consulta la referencia implementación en packages/apps/Car/DebuggingRestrictionController/server). El servicio web de referencia es una función de Firebase Cloud que se puede implementar (para obtener más información, consulta Cloud Functions for Firebase).

Requisitos previos

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

Prepara certificados para firmar tokens de acceso

La entidad emisora del token genera firmas web JSON (JWS) como tokens de acceso. Para óptimo el emisor de referencia solo admite el algoritmo RS256 (firmas RSA con SHA256). Para facilitar la rotación de claves, usa una cadena de certificados en lugar de un solo certificado para firmar los tokens de acceso. Una cadena de certificados típica debe constar de un certificado de la AC raíz, una certificado de la AC intermedio y un certificado de entidad final.

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

Google proporciona una secuencia de comandos de shell para generar certificados autofirmados en packages/apps/Car/DebuggingRestrictionController/server/genkey.sh

Configura Firebase

La entidad emisora del token de referencia usa Firebase Authentication y Firebase Cloud Function.

Para configurar tu cuenta de Firebase, haz lo siguiente:

  1. Para crear un proyecto de Firebase, consulta Agrega Firebase a tu proyecto de Android.
  2. Para habilitar algunos autenticadores de Firebase, consulta ¿Dónde puedo comenzar con Firebase Authentication?.
  3. Para agregar una Cloud Function de Firebase vacía, consulta Obtén Iniciada.
  4. Si aún no lo hiciste, instala las herramientas de Node.js, NPM y Firebase para compilar y implementa la entidad emisora del token.

Integra la app de DRC

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

Compilación empaquetada

Para compilar una app empaquetada, haz lo siguiente:

  1. Copia applicationId, projectId y apiKey. de google-services.json a packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java Si lo haces, la app de DRC podrá conectarse correctamente a Firebase.
  2. Actualiza estas constantes en packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java:
    • TOKEN_USES_SELF_SIGNED_CA indica si los certificados de la AC raíz autofirmados que se usan. Si se habilita, la app de DRC solo confía en el certificado de la AC raíz con codificación PEM que se especifica en ROOT_CA_CERT
    • TOKEN_ISSUER_API_NAME es el nombre de la Cloud Function de Firebase y debe coincida con la Cloud Function que creaste anteriormente en Firebase console.
    • TOKEN_ISSUER_HOSTNAME debe coincidir con el nombre alternativo del asunto en la de entidad final que firmará los tokens de acceso.
    • DRC_TEST_EMAIL y DRC_TEST_PASSWORD son credenciales para un cuenta de prueba opcional, que se puede aprovisionar previamente en Firebase si habilitaste Acceso con correo electrónico y contraseña Solo se usan para pruebas de instrumentación.

Ahora, la app está configurada para usar tu cuenta de Firebase y tus certificados. En Android 9 y versiones posteriores, debes configurar la lista de entidades permitidas de permisos con privilegios. La lista de entidades permitidas 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 sin agrupar

Las compilaciones de DRC sin empaquetar usan Gradle para compilar la app.

Para crear una compilación sin agrupar, haz lo siguiente:

  1. Confirma que instalaste el SDK de Android.
  2. Crea un archivo de texto llamado local.properties en el directorio raíz de la app.
  3. Configura la ubicación del SDK de Android:
     sdk.dir=path/to/android/sdk
    
  4. Para configurar Firebase, copia google-services.json en packages/apps/Car/DebuggingRestrictionController/app Gradle analiza el archivo y configura el resto automáticamente.
  5. Define las variables de entorno. Al igual que con las compilaciones empaquetadas, debes especificar lo siguiente:
    • $TOKEN_USES_SELF_SIGNED_CA: Verdadero o falso
    • $ROOT_CA_CERT: Es la ruta de acceso al certificado de la AC raíz con codificación PEM.
    • $TOKEN_ISSUER_API_NAME: Es el nombre de la función de Firebase Cloud Function.
    • $TOKEN_ISSUER_HOST_NAME: SAN en el certificado;
    • $DRC_TEST_EMAIL y $DRC_TEST_EMAIL: credenciales para una prueba solo para compilaciones de depuración.
  6. Para compilar la app con Gradle, ejecuta un comando como el siguiente:
    $ ./gradlew build
    

Integra la entidad emisora del token

La entidad emisora del token de referencia es una Cloud Function de Firebase que se implementa en Node.js. Solo un usuario autenticado puede llamar a la función. Antes de implementar la app, debes configurar la clave privada y los certificados utilizados para firmar los tokens JWS.

  1. Propaga 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 la AC raíz. al final. El período de vencimiento se puede personalizar y puede establecerse para una duración mayor si se token emitido tarda un tiempo en que una app de DRC pueda recibirlo y consumirlo. Token no se admite la revocación.

  2. Sube la configuración a Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Implementa la Cloud Function de Firebase:
  5. $ firebase deploy --only functions
    
  6. Para administrar y supervisar la entidad emisora de tu token, consulta Administrar de Google Cloud Functions y las opciones del entorno de ejecución.

Cómo establecer restricciones predeterminadas

Las restricciones predeterminadas se pueden aplicar antes del primer inicio. Haz esto con recursos estáticos superposiciones para anular los valores predeterminados en el framework de Android. Las restricciones se pueden aplicar se aplican a diferentes tipos de usuarios. Para obtener más información sobre los diferentes tipos de usuarios, consulta Compatibilidad con multiusuario.

La restricción predeterminada para el usuario del sistema sin interfaz gráfica se puede configurar con el array de cadenas config_defaultFirstUserRestrictions en frameworks/base/core/res/res/values/config.xml Configura esta restricción inhabilita automáticamente Android Debug Bridge (ADB) hasta que se quite la restricción, por ejemplo:

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

Las restricciones predeterminadas para los usuarios normales (por ejemplo, conductores y pasajeros) e invitados se pueden configurar en frameworks/base/core/res/res/xml/config_user_types.xml Puedes superponer estos cadenas para establecer las restricciones predeterminadas en cada tipo de usuario de forma respectiva, 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>