使用以下說明集成 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 Authentication和Firebase Cloud Function 。
要設置您的 Firebase 帳戶:
- 要創建 Firebase 項目,請參閱將 Firebase 添加到您的 Android 項目。
- 要啟用某些 Firebase 身份驗證器,請參閱從哪裡開始使用 Firebase 身份驗證? .
- 要添加一個空的 Firebase Cloud 函數,請參閱入門。
- 如果尚未完成,請安裝 Node.js、NPM 和 Firebase 工具以編譯和部署 Token Issuer。
集成 DRC 應用程序
參考 DRC 應用程序位於packages/apps/Car/DebuggingRestrictionController
中。該應用程序可以與Soong捆綁在 AOSP 中構建,也可以與Gradle不捆綁。
捆綁構建
要構建捆綁應用程序:
- 將
google-services.json
中的applicationId
、projectId
和apiKey
複製到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 函數的名稱,應該與您之前在 Firebase 控制台中創建的 Cloud 函數相匹配。 -
TOKEN_ISSUER_HOSTNAME
應與將簽署訪問令牌的最終實體證書中的主題備用名稱匹配。 -
DRC_TEST_EMAIL
和DRC_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 來編譯應用程序。
要創建非捆綁構建:
- 確認您已安裝 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
:真或假; -
$ROOT_CA_CERT
:PEM 編碼的根 CA 證書的路徑; -
$TOKEN_ISSUER_API_NAME
:Firebase Cloud 函數的名稱; -
$TOKEN_ISSUER_HOST_NAME
:證書中的 SAN; -
$DRC_TEST_EMAIL
和$DRC_TEST_EMAI
L:測試帳戶的憑據,僅調試版本。
-
- 要使用 Gradle 構建應用程序,請運行如下命令:
$ ./gradlew build
集成令牌發行者
參考 Token Issuer 是一個在 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 雲功能:
- 要管理和監控您的令牌頒發者,請參閱管理函數部署和運行時選項。
$ 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>