Sử dụng hướng dẫn trên trang này để tích hợp Bộ điều khiển hạn chế gỡ lỗi AAOS (Cộng hòa dân chủ Congo).
Hình 1. Ví dụ về ứng dụng DRC.
Kiến trúc
Kiến trúc DRC được minh hoạ trong Hình 2. Các thành phần được tô màu đỏ (nhà phát hành mã thông báo và DRC) có các cách triển khai tệp đối chiếu đi kèm mà bạn có thể tuỳ chỉnh.
Hình 2. Kiến trúc DRC.
DRC là gì?
Đầu phát trung tâm của ô tô có ứng dụng DRC (xem cách triển khai tham chiếu trong
packages/apps/Car/DebuggingRestrictionController
). Ứng dụng tham chiếu bao gồm
logic để nhận mã thông báo truy cập từ tổ chức phát hành mã thông báo, xác thực mã thông báo đó và
rồi áp dụng các thay đổi về hạn chế gỡ lỗi như đã chỉ định trong mã thông báo. Logic bao gồm
các yếu tố trải nghiệm người dùng cơ bản ở bên cạnh xe.
Công ty phát hành mã thông báo là gì?
Đây là một dịch vụ web phát hành mã truy cập đã ký ở dạng mật mã (xem tài liệu tham khảo
trong packages/apps/Car/DebuggingRestrictionController/server
).
Dịch vụ web tham khảo là một hàm Firebase Cloud có thể triển khai (để tìm hiểu thêm, hãy xem
Chức năng đám mây dành cho
Firebase).
Điều kiện tiên quyết
Trước khi triển khai quá trình triển khai tệp đối chiếu, hãy nhớ hoàn tất các việc sau.
Chuẩn bị chứng chỉ để ký mã truy cập
Tổ chức phát hành mã thông báo tạo các Chữ ký web JSON (JWS) làm mã truy cập. Để tối ưu khả năng tương thích, nhà phát hành tham chiếu chỉ hỗ trợ thuật toán RS256 (chữ ký RSA với SHA256). Để tạo điều kiện cho việc xoay vòng khoá, hãy sử dụng chuỗi chứng chỉ thay vì một chứng chỉ để ký mã truy cập. Một chuỗi chứng chỉ thông thường phải bao gồm chứng chỉ CA gốc, chứng chỉ CA trung gian và chứng chỉ thực thể cuối.
Chứng chỉ thực thể cuối ký mã thông báo JWS không khác với TLS chuẩn chứng chỉ. Bạn có thể mua chứng chỉ từ các CA công khai như DigiCert hoặc duy trì chuỗi chứng chỉ của riêng bạn bằng cách sử dụng chứng chỉ CA gốc tự ký hoặc Mô-đun bảo mật phần cứng. Chứng chỉ thực thể cuối phải là chứng chỉ X509v3 có Tên thay thế của chủ thể (SAN). Tiện ích SAN chứa giá trị nhận dạng (ví dụ: tên máy chủ) của mã thông báo nhà phát hành. Cuối cùng, chứng chỉ RSA sẽ được ưu tiên hơn chứng chỉ EC vì mã thông báo tổ chức phát hành thẻ chỉ hỗ trợ RS256.
Google cung cấp tập lệnh shell để tạo chứng chỉ tự ký
packages/apps/Car/DebuggingRestrictionController/server/genkey.sh
.
Thiết lập Firebase
Tổ chức phát hành mã tham chiếu sử dụng Xác thực Firebase và Chức năng đám mây của Firebase.
Cách thiết lập tài khoản Firebase:
- Để tạo một dự án Firebase, hãy xem Thêm Firebase vào dự án Android của bạn.
- Để bật một số trình xác thực Firebase, hãy xem Tôi có thể bắt đầu với tính năng Xác thực Firebase?.
- Để thêm một hàm Firebase Cloud trống, hãy xem Tải Đã bắt đầu.
- Nếu chưa thực hiện, hãy cài đặt các công cụ
Node.js
, GMS và Firebase để biên dịch và triển khai trình phát hành mã thông báo.
Tích hợp ứng dụng DRC
Ứng dụng DRC tham chiếu nằm ở
packages/apps/Car/DebuggingRestrictionController
. Bạn có thể xây dựng ứng dụng
theo gói trong AOSP (Dự án nguồn mở Android) với Soong hoặc
không theo nhóm với Gradle.
Bản dựng theo gói
Cách tạo một ứng dụng theo gói:
- Sao chép
applicationId
,projectId
vàapiKey
từgoogle-services.json
sangpackages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java
. Thao tác này cho phép ứng dụng DRC kết nối đúng cách với Firebase. - Cập nhật các hằng số này trong
packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java
:TOKEN_USES_SELF_SIGNED_CA
cho biết liệu chứng chỉ CA gốc tự ký có đã sử dụng. Nếu được bật, ứng dụng DRC chỉ tin cậy chứng chỉ CA gốc được mã hoá PEM được chỉ định trongROOT_CA_CERT
.TOKEN_ISSUER_API_NAME
là tên của hàm Firebase Cloud khớp với hàm Đám mây mà bạn đã tạo trước đó trong Bảng điều khiển của Firebase.TOKEN_ISSUER_HOSTNAME
phải khớp với Tên thay thế của chủ đề trong chứng chỉ thực thể cuối sẽ ký mã truy cập.DRC_TEST_EMAIL
vàDRC_TEST_PASSWORD
là thông tin đăng nhập cho một tài khoản thử nghiệm không bắt buộc. Bạn có thể được cấp phép sẵn trong Firebase nếu đã bật Đăng nhập bằng email/mật khẩu. Các tham số này chỉ được dùng cho kiểm thử đo lường.
Ứng dụng này hiện đã được định cấu hình để sử dụng tài khoản Firebase và các chứng chỉ của bạn.
Trong Android 9 trở lên, bạn phải thiết lập
danh sách cho phép đặc quyền.
Danh sách cho phép phải chứa ít nhất android.permission.MANAGE_USERS
. Ví dụ:
<permissions> <privapp-permissions package="com.android.car.debuggingrestrictioncontroller"> <permission name="android.permission.INTERNET"/> <permission name="android.permission.MANAGE_USERS"/> </privapp-permissions> </permissions>
Bản dựng không theo nhóm
Các bản dựng DRC chưa được gói sử dụng Gradle để biên dịch ứng dụng.
Cách tạo một bản dựng không theo gói:
- Xác nhận bạn đã cài đặt SDK Android.
- Tạo tệp văn bản có tên
local.properties
trong thư mục gốc của ứng dụng. - Đặt vị trí của SDK Android:
sdk.dir=path/to/android/sdk
- Để thiết lập Firebase, hãy sao chép
google-services.json
vàopackages/apps/Car/DebuggingRestrictionController/app
Gradle phân tích cú pháp tệp và tự động thiết lập phần còn lại. - Xác định các biến môi trường. Giống như với các bản dựng theo gói, bạn phải chỉ định:
$TOKEN_USES_SELF_SIGNED_CA
: đúng hoặc sai;$ROOT_CA_CERT
: đường dẫn đến chứng chỉ CA gốc được mã hoá PEM;$TOKEN_ISSUER_API_NAME
: tên của hàm Firebase Cloud;$TOKEN_ISSUER_HOST_NAME
: SAN trong chứng chỉ;$DRC_TEST_EMAIL
và$DRC_TEST_EMAI
L: thông tin đăng nhập cho một thử nghiệm tài khoản, chỉ gỡ lỗi bản dựng.
- Để tạo bản dựng ứng dụng bằng Gradle, hãy chạy một lệnh như sau:
$ ./gradlew build
Tích hợp trình phát hành mã thông báo
Bên phát hành mã tham chiếu là một Hàm đám mây của Firebase được triển khai trong Node.js
.
Chỉ người dùng đã xác thực mới có thể gọi hàm này. Trước khi triển khai ứng dụng, bạn phải đặt
khoá riêng tư và chứng chỉ dùng để ký mã thông báo JWS.
- Điền vào tệp JSON với các nội dung sau:
{ "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" }
Các chứng chỉ được sắp xếp theo thứ tự gồm chứng chỉ thực thể cuối trước tiên và chứng chỉ CA gốc ở cuối. Khoảng thời gian hết hạn có thể tuỳ chỉnh và có thể được đặt thành khoảng thời gian dài hơn nếu một mã thông báo được phát hành mất một khoảng thời gian trước khi ứng dụng DRC nhận và sử dụng được. Mã thông báo không được hỗ trợ.
- Tải cấu hình lên Firebase:
- Triển khai hàm Firebase Cloud:
- Để quản lý và giám sát nhà phát hành mã thông báo, hãy xem Quản lý các tuỳ chọn thời gian chạy và triển khai hàm.
$ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
$ firebase deploy --only functions
Đặt hạn chế mặc định
Bạn có thể áp dụng các hạn chế mặc định trước lần khởi động đầu tiên. Thực hiện việc này bằng tài nguyên tĩnh để ghi đè các giá trị mặc định trong khung Android. Các quy định hạn chế có thể tương ứng với nhau được áp dụng cho các kiểu người dùng khác nhau. Để tìm hiểu về các kiểu người dùng, hãy xem Hỗ trợ nhiều người dùng.
Bạn có thể định cấu hình chế độ hạn chế mặc định cho người dùng hệ thống không có giao diện người dùng bằng
mảng chuỗi config_defaultFirstUserRestrictions
trong
frameworks/base/core/res/res/values/config.xml
. Đặt hạn chế này
tự động tắt Cầu gỡ lỗi Android (ADB) cho đến khi hạn chế được loại bỏ, đối với
ví dụ:
<string-array translatable="false" name="config_defaultFirstUserRestrictions"> <item>no_debugging_features</item> </string-array>
Các quy định hạn chế mặc định đối với người dùng thông thường (ví dụ: người lái xe và hành khách),
và khách có thể thiết lập trong
frameworks/base/core/res/res/xml/config_user_types.xml
. Bạn có thể phủ các chủ đề này
để đặt quy tắc hạn chế mặc định tương ứng cho từng kiểu người dùng, ví dụ:
<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>