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:
- Para crear un proyecto de Firebase, consulta Agrega Firebase a tu proyecto de Android.
- Para habilitar algunos autenticadores de Firebase, consulta ¿Dónde puedo comenzar con Firebase Authentication?.
- Para agregar una Cloud Function de Firebase vacía, consulta Obtén Iniciada.
- 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:
- Copia
applicationId
,projectId
yapiKey
. degoogle-services.json
apackages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java
Si lo haces, la app de DRC podrá conectarse correctamente a Firebase. - 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 enROOT_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
yDRC_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:
- Confirma que instalaste el SDK de Android.
- Crea un archivo de texto llamado
local.properties
en el directorio raíz de la app. - Configura 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 el resto automáticamente. - 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_EMAI
L: credenciales para una prueba solo para compilaciones de depuración.
- 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.
- 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.
- Sube la configuración a Firebase:
- Implementa la Cloud Function de Firebase:
- Para administrar y supervisar la entidad emisora de tu token, consulta Administrar de Google Cloud Functions 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. 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>