调试限制控制器集成指南

请按照本页上的说明集成 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 AuthenticationFirebase Cloud Function

要设置您的 Firebase 帐号

  1. 要创建 Firebase 项目,请参阅将 Firebase 添加到您的 Android 项目
  2. 要启用某些 Firebase 身份验证器,请参阅Firebase Authentication 入门
  3. 要添加一个空的 Firebase Cloud Function,请参阅入门
  4. 如果尚未完成,请安装 Node.js、NPM 和 Firebase 工具以编译和部署令牌发布者。

集成 DRC 应用

参考 DRC 应用位于 packages/apps/Car/DebuggingRestrictionController 中。该应用可以使用 Soong 在 AOSP 中捆绑构建,也可以使用 Gradle 解绑构建。

捆绑构建

要构建捆绑应用

  1. applicationIdprojectIdapiKeygoogle-services.json 复制到 packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java 中。这样做可使 DRC 应用正确连接到 Firebase。
  2. 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_EMAILDRC_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 编译应用。

要创建解绑构建

  1. 确认您已安装 Android SDK。
  2. 在应用的根目录中创建一个名为 local.properties 的文本文件。
  3. 设置 Android SDK 的位置
     sdk.dir=path/to/android/sdk
  4. 要设置 Firebase,请将 google-services.json 复制到 packages/apps/Car/DebuggingRestrictionController/app。Gradle 会解析该文件并自动设置其余内容。
  5. 定义环境变量。与捆绑构建一样,您必须指定
    • $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_EMAIL:测试帐号的凭据,仅限调试构建。
  6. 要使用 Gradle 构建应用,请运行如下命令
    $ ./gradlew build

集成令牌发布者

参考令牌发布者是在 Node.js 中实现的 Firebase Cloud Function。该函数只能由经过身份验证的用户调用。在部署应用之前,您必须设置用于签署 JWS 令牌的私钥和证书。

  1. 使用以下内容填充 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 应用接收和使用之前需要一段时间,则可以将其设置为更长的持续时间。不支持令牌撤销。

  2. 将配置上传到 Firebase
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
  4. 部署 Firebase Cloud Function
  5. $ firebase deploy --only functions
  6. 要管理和监控您的令牌发布者,请参阅管理函数部署和运行时选项

设置默认限制

默认限制可以在首次启动之前应用。使用静态资源叠加来覆盖 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>