Usa las instrucciones de esta página para integrar el controlador de restricción de depuración (DRC) de AAOS.
Figura 1: Ejemplo de app de DRC
Arquitectura
La arquitectura de la DRC se ilustra en la Figura 2. Los componentes delineados en rojo (emisor de tokens y DRC) tienen implementaciones de referencia que puedes personalizar.
Figura 2: Arquitectura de DRC
¿Qué es la DRC?
La unidad 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 del emisor del token, validarlo y, luego, aplicar los cambios de restricción de depuración como se especifica en el token. La lógica incluye elementos básicos de UX en el automóvil.
¿Qué es el emisor del token?
Este es un servicio web que emite tokens de acceso firmados de forma criptográfica (consulta la implementación de referencia en packages/apps/Car/DebuggingRestrictionController/server
). El servicio web de referencia es una Cloud Function de Firebase implementable (para obtener más información, consulta Cloud Functions para 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
El emisor del token genera firmas web JSON (JWS) como tokens de acceso. Para obtener una compatibilidad óptima, 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 AC raíz, un certificado de AC 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. Puedes comprar un certificado de AC públicas, como DigiCert, o mantener tu propia cadena de certificados con certificados de AC 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, el nombre de host) del emisor del token. Por último, se deben preferir los certificados RSA sobre los certificados EC porque el emisor de tokens 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
El emisor del token de referencia usa Firebase Authentication y Firebase Cloud Function.
Para configurar tu cuenta de Firebase, sigue estos pasos:
- Para crear un proyecto de Firebase, consulta Agrega Firebase a tu proyecto de Android.
- Para habilitar algunos autenticadores de Firebase, consulta ¿Por dónde empiezo con Firebase Authentication?.
- Para agregar una función de Cloud Functions de Firebase vacía, consulta Cómo comenzar.
- Si aún no lo has hecho, instala
Node.js
, NPM y las herramientas de Firebase para compilar e implementar el emisor de tokens.
Integra la app de DRC
La app de DRC de referencia se encuentra en packages/apps/Car/DebuggingRestrictionController
. La app se puede compilar en un paquete en AOSP con Soong o sin un paquete con Gradle.
Compilación agrupada
Para compilar una app empaquetada, haz lo siguiente:
- Copia
applicationId
,projectId
yapiKey
degoogle-services.json
enpackages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java
. De esta manera, la app de DRC se puede conectar correctamente a Firebase. - Actualiza estas constantes en
packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java
:TOKEN_USES_SELF_SIGNED_CA
indica si se usan certificados de AC raíz autofirmados. Si está habilitada, la app de DRC solo confía en el certificado de AC raíz con codificación PEM especificado enROOT_CA_CERT
.TOKEN_ISSUER_API_NAME
es el nombre de la función de Cloud de Firebase y debe coincidir con la función de Cloud que creaste antes en Firebase console.TOKEN_ISSUER_HOSTNAME
debe coincidir con el nombre alternativo del asunto en el certificado de la entidad final que firmará los tokens de acceso.DRC_TEST_EMAIL
yDRC_TEST_PASSWORD
son credenciales de una cuenta de prueba opcional, que se puede aprovisionar previamente en Firebase si habilitaste el acceso con correo electrónico o contraseña. Solo se usan para pruebas instrumentadas.
La app ahora 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 empaquetar
Las compilaciones de DRC sin empaquetar usan Gradle para compilar la app.
Para crear una compilación sin agrupar, sigue estos pasos:
- Confirma que instalaste el SDK de Android.
- Crea un archivo de texto llamado
local.properties
en el directorio raíz de la app. - Establece la ubicación del SDK de Android:
sdk.dir=path/to/android/sdk
- Para configurar Firebase, copia
google-services.json
enpackages/apps/Car/DebuggingRestrictionController/app
. Gradle analiza el archivo y configura automáticamente el resto. - Define las variables de entorno. Al igual que con las compilaciones agrupadas, 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 codificado en PEM.$TOKEN_ISSUER_API_NAME
: Es el nombre de la función de Cloud Functions de Firebase.$TOKEN_ISSUER_HOST_NAME
: SAN en el certificado$DRC_TEST_EMAIL
y$DRC_TEST_EMAI
L: credenciales para una cuenta de prueba, solo compilaciones de depuración
- Para compilar la app con Gradle, ejecuta un comando como este:
$ ./gradlew build
Integra el emisor de tokens
El emisor de tokens de referencia es una función de Cloud Functions de Firebase implementada 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 que se usan para firmar los tokens JWS.
- Completa 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 AC raíz al final. El período de vencimiento se puede personalizar y se puede establecer una duración más larga si un token emitido tarda un tiempo en poder ser recibido y consumido por una app de DRC. No se admite la revocación de tokens.
- Sube la configuración a Firebase:
- Implementa la función de Cloud Functions de Firebase:
- Para administrar y supervisar el emisor de tokens, consulta Administra la implementación de funciones y las opciones del entorno de ejecución.
$ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
$ firebase deploy --only functions
Cómo establecer restricciones predeterminadas
Las restricciones predeterminadas se pueden aplicar antes del primer inicio. Para ello, usa superposiciones de recursos estáticos para anular los valores predeterminados del framework de Android. Las restricciones se pueden aplicar de manera respectiva a diferentes tipos de usuarios. Para obtener información sobre los diferentes tipos de usuarios, consulta Compatibilidad con varios usuarios.
La restricción predeterminada para el usuario del sistema sin cabeza se puede configurar con el array de cadenas config_defaultFirstUserRestrictions
en frameworks/base/core/res/res/values/config.xml
. Si configuras esta restricción, se 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) y los invitados se pueden configurar en frameworks/base/core/res/res/xml/config_user_types.xml
. Puedes superponer estas cadenas para establecer las restricciones predeterminadas en cada tipo de usuario, 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>