请按照本页上的说明集成 AAOS 调试限制控制器 (DRC)。
图 1. DRC 应用示例。
架构
图 2 说明了 DRC 架构。以红色勾勒出的组件(令牌发布者和 DRC)附带有您可以自定义的参考实现。
图 2. DRC 架构。
什么是 DRC?
车载信息娱乐系统主机包含 DRC 应用(请参阅 packages/apps/Car/DebuggingRestrictionController
中的参考实现)。参考应用包含用于从令牌发布者接收访问令牌、验证令牌,然后应用令牌中指定的调试限制更改的逻辑。该逻辑包括车载端的基本用户体验元素。
什么是令牌发布者?
这是一个 Web 服务,用于发布经过加密签名访问令牌(请参阅 packages/apps/Car/DebuggingRestrictionController/server
中的参考实现)。参考 Web 服务是一个可部署的 Firebase Cloud Function(要了解更多信息,请参阅 Firebase Cloud Functions)。
前提条件
在部署参考实现之前,请务必完成以下任务。
准备用于签署访问令牌的证书
令牌发布者生成 JSON Web 签名 (JWS) 作为访问令牌。为了获得最佳兼容性,参考发布者仅支持 RS256 算法(使用 SHA256 的 RSA 签名)。为了方便密钥轮换,请使用证书链而不是单个证书来签署访问令牌。典型的证书链应包含根 CA 证书、中间 CA 证书和最终实体证书。
用于签署 JWS 令牌的最终实体证书与标准 TLS 证书并无不同。您可以从 DigiCert 等公共 CA 购买证书,也可以使用自签名根 CA 证书或硬件安全模块来维护自己的证书链。最终实体证书应为具有主题备用名称 (SAN) 扩展的 X509v3 证书。SAN 扩展包含令牌发布者的标识符(例如,主机名)。最后,RSA 证书应优先于 EC 证书,因为令牌发布者仅支持 RS256。
Google 在 packages/apps/Car/DebuggingRestrictionController/server/genkey.sh
中提供了一个用于生成自签名证书的 shell 脚本。
设置 Firebase
参考令牌发布者使用 Firebase Authentication 和 Firebase Cloud Function。
要设置您的 Firebase 帐号
- 要创建 Firebase 项目,请参阅将 Firebase 添加到您的 Android 项目。
- 要启用某些 Firebase 身份验证器,请参阅Firebase Authentication 入门。
- 要添加一个空的 Firebase Cloud Function,请参阅入门。
- 如果尚未完成,请安装
Node.js
、NPM 和 Firebase 工具以编译和部署令牌发布者。
集成 DRC 应用
参考 DRC 应用位于 packages/apps/Car/DebuggingRestrictionController
中。该应用可以使用 Soong 在 AOSP 中捆绑构建,也可以使用 Gradle 解绑构建。
捆绑构建
要构建捆绑应用
- 将
applicationId
、projectId
和apiKey
从google-services.json
复制到packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java
中。这样做可使 DRC 应用正确连接到 Firebase。 - 在
packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java
中更新以下常量TOKEN_USES_SELF_SIGNED_CA
指示是否使用自签名根 CA 证书。如果启用,DRC 应用将仅信任ROOT_CA_CERT
中指定的 PEM 编码根 CA 证书。TOKEN_ISSUER_API_NAME
是 Firebase Cloud Function 的名称,应与您之前在 Firebase 控制台中创建的 Cloud Function 匹配。TOKEN_ISSUER_HOSTNAME
应与将签署访问令牌的最终实体证书中的主题备用名称匹配。DRC_TEST_EMAIL
和DRC_TEST_PASSWORD
是可选测试帐号的凭据,如果您已启用电子邮件/密码登录,则可以在 Firebase 中预先配置这些凭据。这些凭据仅用于检测工具测试。
现在,该应用已配置为使用您的 Firebase 帐号和您的证书。在 Android 9 及更高版本中,您必须设置特许权限允许名单。允许名单必须至少包含 android.permission.MANAGE_USERS
。例如
<permissions> <privapp-permissions package="com.android.car.debuggingrestrictioncontroller"> <permission name="android.permission.INTERNET"/> <permission name="android.permission.MANAGE_USERS"/> </privapp-permissions> </permissions>
解绑构建
解绑 DRC 构建使用 Gradle 编译应用。
要创建解绑构建
- 确认您已安装 Android SDK。
- 在应用的根目录中创建一个名为
local.properties
的文本文件。 - 设置 Android SDK 的位置
sdk.dir=path/to/android/sdk
- 要设置 Firebase,请将
google-services.json
复制到packages/apps/Car/DebuggingRestrictionController/app
。Gradle 会解析该文件并自动设置其余内容。 - 定义环境变量。与捆绑构建一样,您必须指定
$TOKEN_USES_SELF_SIGNED_CA
:true 或 false;$ROOT_CA_CERT
:PEM 编码根 CA 证书的路径;$TOKEN_ISSUER_API_NAME
:Firebase Cloud Function 的名称;$TOKEN_ISSUER_HOST_NAME
:证书中的 SAN;$DRC_TEST_EMAIL
和$DRC_TEST_EMAI
L:测试帐号的凭据,仅限调试构建。
- 要使用 Gradle 构建应用,请运行如下命令
$ ./gradlew build
集成令牌发布者
参考令牌发布者是在 Node.js
中实现的 Firebase Cloud Function。该函数只能由经过身份验证的用户调用。在部署应用之前,您必须设置用于签署 JWS 令牌的私钥和证书。
- 使用以下内容填充 JSON 文件
{ "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" }
证书按最终实体证书在前、根 CA 证书在后的顺序排列。到期时间段是可自定义的,如果发布的令牌在 DRC 应用接收和使用之前需要一段时间,则可以将其设置为更长的持续时间。不支持令牌撤销。
- 将配置上传到 Firebase
- 部署 Firebase Cloud Function
- 要管理和监控您的令牌发布者,请参阅管理函数部署和运行时选项。
$ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
$ firebase deploy --only functions
设置默认限制
默认限制可以在首次启动之前应用。使用静态资源叠加来覆盖 Android 框架中的默认值。限制可以分别应用于不同类型的用户。要了解不同类型的用户,请参阅多用户支持。
无头系统用户的默认限制可以使用 frameworks/base/core/res/res/values/config.xml
中的 config_defaultFirstUserRestrictions
字符串数组进行配置。设置此限制会自动停用 Android 调试桥 (ADB),直到移除限制,例如
<string-array translatable="false" name="config_defaultFirstUserRestrictions"> <item>no_debugging_features</item> </string-array>
常规用户(例如,驾驶员和乘客)和访客的默认限制可以在 frameworks/base/core/res/res/xml/config_user_types.xml
中配置。您可以叠加这些字符串,以便分别设置每种类型用户的默认限制,例如
<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>