調試限制控制器集成指南

使用以下說明集成 AAOS 調試限制控制器 (DRC)。

圖 1. DRC 應用程序示例

建築學

DRC 架構如下圖所示。以紅色標出的組件(令牌發行者和首次使用限制控制器)具有您可以自定義的隨附參考實現。

圖 2. DRC 架構

什麼是剛果民主共和國?

車頭單元包括 DRC 應用程序(請參閱packages/apps/Car/DebuggingRestrictionController中的參考實現)。參考應用程序包括用於從令牌頒發者接收訪問令牌、驗證令牌以及應用令牌中指定的調試限制更改的邏輯。邏輯包括汽車端的基本用戶體驗元素。

什麼是代幣發行者?

這是一個發布加密簽名訪問令牌的 Web 服務(請參閱packages/apps/Car/DebuggingRestrictionController/server中的參考實現)。參考 Web 服務是可部署的 Firebase Cloud 函數(要了解更多信息,請參閱Cloud Functions for Firebase )。

先決條件

在部署參考實施之前,請務必完成以下任務。

準備用於簽署訪問令牌的證書

令牌頒發者生成 JSON Web 簽名 (JWS) 作為訪問令牌。為了獲得最佳兼容性,參考發行者僅支持 RS256 算法(帶有 SHA256 的 RSA 簽名)。為了便於密鑰輪換,請使用證書鏈而不是單個證書來簽署訪問令牌。典型的證書鏈應該由根 CA 證書、中間 CA 證書和最終實體證書組成。

簽署 JWS 令牌的最終實體證書與標準 TLS 證書沒有什麼不同。您可以從公共 CA(例如 DigiCert)購買證書,也可以使用自簽名根 CA 證書或硬件安全模塊維護您自己的證書鏈。最終實體證書應該是帶有主題備用名稱 (SAN) 擴展的 X509v3 證書。 SAN 擴展包含令牌頒發者的標識符(例如,主機名)。最後,RSA 證書應優先於 EC 證書,因為令牌頒發者僅支持 RS256。

Google 在packages/apps/Car/DebuggingRestrictionController/server/genkey.sh中提供了一個用於生成自簽名證書的 shell 腳本。

設置 Firebase

參考 Token Issuer 使用Firebase AuthenticationFirebase Cloud Function

要設置您的 Firebase 帳戶:

  1. 要創建 Firebase 項目,請參閱將 Firebase 添加到您的 Android 項目
  2. 要啟用某些 Firebase 身份驗證器,請參閱從哪裡開始使用 Firebase 身份驗證? .
  3. 要添加一個空的 Firebase Cloud 函數,請參閱入門
  4. 如果尚未完成,請安裝 Node.js、NPM 和 Firebase 工具以編譯和部署 Token Issuer。

集成 DRC 應用程序

參考 DRC 應用程序位於packages/apps/Car/DebuggingRestrictionController中。該應用程序可以與Soong捆綁在 AOSP 中構建,也可以與Gradle捆綁

捆綁構建

要構建捆綁應用程序:

  1. google-services.json中的applicationIdprojectIdapiKey複製到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 函數的名稱,應該與您之前在 Firebase 控制台中創建的 Cloud 函數相匹配。
    • TOKEN_ISSUER_HOSTNAME應與將簽署訪問令牌的最終實體證書中的主題備用名稱匹配。
    • DRC_TEST_EMAILDRC_TEST_PASSWORD是可選測試帳戶的憑據,如果您啟用了電子郵件/密碼登錄,則可以在 Firebase 中預先配置。這些僅用於儀器測試。

該應用現已配置為使用您的 Firebase 帳戶和證書。在 Android 9 及更高版本中,您必須設置Privileged Permission Allowlisting 。許可名單必須至少包含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 :真或假;
    • $ROOT_CA_CERT :PEM 編碼的根 CA 證書的路徑;
    • $TOKEN_ISSUER_API_NAME :Firebase Cloud 函數的名稱;
    • $TOKEN_ISSUER_HOST_NAME :證書中的 SAN;
    • $DRC_TEST_EMAIL$DRC_TEST_EMAI L:測試帳戶的憑據,僅調試版本。
  6. 要使用 Gradle 構建應用程序,請運行如下命令:
    $ ./gradlew build
    

集成令牌發行者

參考 Token Issuer 是一個在 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 雲功能:
  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>