使用本頁上的說明整合 AAOS 調試限制控制器 (DRC)。
圖 1.DRC應用範例。
建築學
DRC 架構如圖 2 所示。紅色框出的元件(令牌頒發者和 DRC)具有您可以自訂的隨附參考實作。
圖 2.DRC架構。
什麼是剛果民主共和國?
汽車主機包括 DRC 應用程式(請參閱packages/apps/Car/DebuggingRestrictionController
中的參考實作)。參考應用程式包括用於從令牌頒發者接收存取令牌、驗證令牌,然後應用令牌中指定的偵錯限制變更的邏輯。此邏輯包括汽車端的基本使用者體驗元素。
代幣發行者是什麼?
這是一個發出加密簽章存取權杖的 Web 服務(請參閱packages/apps/Car/DebuggingRestrictionController/server
中的參考實作)。參考 Web 服務是可部署的 Firebase Cloud 函數(要了解更多信息,請參閱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
參考令牌頒發者使用Firebase 驗證和Firebase Cloud Function 。
要設定您的 Firebase 帳戶:
- 若要建立 Firebase 項目,請參閱將 Firebase 新增至您的 Android 項目。
- 若要啟用某些 Firebase 驗證器,請參閱從哪裡開始使用 Firebase 驗證? 。
- 若要新增空的 Firebase Cloud 函數,請參閱入門。
- 如果尚未完成,請安裝
Node.js
、 NPM 和 Firebase 工具來編譯和部署令牌頒發者。
整合 DRC 應用程式
參考 DRC 應用程式位於packages/apps/Car/DebuggingRestrictionController
中。該應用程式可以在 AOSP 中與Soong捆綁在一起構建,也可以與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 雲端函數的名稱,應與您先前在 Firebase 控制台中建立的雲端函數相符。 -
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
:真或假; -
$ROOT_CA_CERT
:PEM 編碼的根 CA 憑證的路徑; -
$TOKEN_ISSUER_API_NAME
:Firebase 雲端函數的名稱; -
$TOKEN_ISSUER_HOST_NAME
:憑證中的 SAN; -
$DRC_TEST_EMAIL
和$DRC_TEST_EMAI
:測試帳戶的憑證,僅調試版本。
-
- 若要使用 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雲端功能:
- 若要管理和監控您的令牌頒發者,請參閱管理函數部署和執行時間選項。
$ 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>