ใช้วิธีการในหน้านี้เพื่อผสานรวมตัวควบคุมข้อจํากัดการแก้ไขข้อบกพร่อง AAOS (DRC)
รูปที่ 1 ตัวอย่างแอป DRC
สถาปัตยกรรม
สถาปัตยกรรม DRC แสดงอยู่ในรูปที่ 2 คอมโพเนนต์ที่ขีดเส้นขอบสีแดง (ผู้ออกโทเค็นและ DRC) มีการใช้งานอ้างอิงประกอบที่คุณสามารถปรับแต่งได้
รูปที่ 2 สถาปัตยกรรม DRC
DRC คืออะไร
จอหน้ารถมีแอป DRC (ดูการใช้งานอ้างอิงใน packages/apps/Car/DebuggingRestrictionController
) แอปอ้างอิงมีตรรกะในการรับโทเค็นการเข้าถึงจากผู้ออกโทเค็น การตรวจสอบโทเค็น และการใช้การเปลี่ยนแปลงข้อจำกัดการแก้ไขข้อบกพร่องตามที่ระบุไว้ในโทเค็น ตรรกะนี้รวมถึงองค์ประกอบ UX พื้นฐานในฝั่งรถ
ผู้ออกโทเค็นคืออะไร
ซึ่งเป็นเว็บเซอร์วิสที่ออกโทเค็นการเข้าถึงที่ลงนามด้วยวิทยาการเข้ารหัส (ดูการใช้งานข้อมูลอ้างอิงใน packages/apps/Car/DebuggingRestrictionController/server
)
เว็บเซอร์วิสข้อมูลอ้างอิงคือฟังก์ชัน Firebase Cloud ที่ใช้งานได้ (ดูข้อมูลเพิ่มเติมที่ Cloud Functions for Firebase)
สิ่งที่ต้องมีก่อน
ก่อนทำให้การติดตั้งใช้งานตามข้อมูลอ้างอิงใช้งานได้ โปรดทำตามขั้นตอนต่อไปนี้
เตรียมใบรับรองสำหรับการลงนามโทเค็นการเข้าถึง
ผู้ออกโทเค็นจะสร้าง JSON Web Signature (JWS) เป็นโทเค็นการเข้าถึง ผู้ออกข้อมูลอ้างอิงรองรับเฉพาะอัลกอริทึม RS256 (ลายเซ็น RSA ที่มี SHA256) เพื่อให้เข้ากันได้ดีที่สุด ใช้เชนใบรับรองแทนใบรับรองเดียวเพื่อลงนามในโทเค็นการเข้าถึง เพื่อช่วยในการหมุนเวียนคีย์ โดยปกติแล้วเชนใบรับรองควรประกอบด้วยใบรับรอง CA รูท ใบรับรอง CA ระดับกลาง และใบรับรองเอนทิตีปลายทาง
ใบรับรองเอนทิตีปลายทางที่ลงนามในโทเค็น JWS นั้นไม่แตกต่างจากใบรับรอง TLS มาตรฐาน คุณสามารถซื้อใบรับรองจาก CA สาธารณะ เช่น DigiCert หรือดูแลรักษาเชนใบรับรองของคุณเองโดยใช้ใบรับรอง CA รูทแบบ Self-signed หรือโมดูลความปลอดภัยของฮาร์ดแวร์ ใบรับรองเอนทิตีปลายทางควรเป็นใบรับรอง X509v3 ที่มีส่วนขยาย Subject Alternative Name (SAN) ส่วนขยาย SAN มีตัวระบุ (เช่น ชื่อโฮสต์) ของผู้ออกโทเค็น สุดท้าย คุณควรใช้ใบรับรอง RSA แทนใบรับรอง EC เนื่องจากผู้ออกโทเค็นรองรับเฉพาะ RS256
Google มีสคริปต์เชลล์สำหรับสร้างใบรับรองที่ลงนามด้วยตนเองใน packages/apps/Car/DebuggingRestrictionController/server/genkey.sh
ตั้งค่า Firebase
ผู้ออกโทเค็นอ้างอิงใช้ Firebase Authentication และ Firebase Cloud Function
วิธีตั้งค่าบัญชี Firebase
- หากต้องการสร้างโปรเจ็กต์ Firebase โปรดดูหัวข้อเพิ่ม Firebase ลงในโปรเจ็กต์ Android
- หากต้องการเปิดใช้โปรแกรมตรวจสอบสิทธิ์ Firebase บางรายการ โปรดดูหัวข้อฉันจะเริ่มต้นใช้งานการตรวจสอบสิทธิ์ Firebase ได้จากที่ใด
- หากต้องการเพิ่ม Firebase Cloud Function ที่ว่างเปล่า โปรดดูหัวข้อเริ่มต้นใช้งาน
- ติดตั้งเครื่องมือ
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 แบบ Self-signed หรือไม่ หากเปิดใช้ แอป DRC จะเชื่อถือเฉพาะใบรับรอง CA รูทที่เข้ารหัสด้วย PEM ที่ระบุไว้ในROOT_CA_CERT
TOKEN_ISSUER_API_NAME
คือชื่อของฟังก์ชัน Firebase Cloud และควรตรงกับฟังก์ชัน Cloud ที่คุณสร้างไว้ก่อนหน้านี้ในคอนโซล FirebaseTOKEN_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
: เส้นทางไปยังใบรับรอง CA รูทที่เข้ารหัสด้วย PEM$TOKEN_ISSUER_API_NAME
: ชื่อฟังก์ชัน Firebase Cloud$TOKEN_ISSUER_HOST_NAME
: SAN ในใบรับรอง$DRC_TEST_EMAIL
และ$DRC_TEST_EMAI
L: ข้อมูลเข้าสู่ระบบสำหรับบัญชีทดสอบ บิลด์แก้ไขข้อบกพร่องเท่านั้น
- หากต้องการสร้างแอปด้วย Gradle ให้เรียกใช้คําสั่งดังนี้
$ ./gradlew build
ผสานรวมผู้ออกโทเค็น
ผู้ออกโทเค็นอ้างอิงคือ Firebase Cloud Function ที่ติดตั้งใช้งานใน Node.js
ฟังก์ชันนี้เรียกใช้ได้เฉพาะโดยผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์เท่านั้น ก่อนทำให้แอปใช้งานได้ คุณต้องตั้งค่าคีย์ส่วนตัวและใบรับรองที่ใช้ลงนามในโทเค็น 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 โดยทำดังนี้
- ทำให้ฟังก์ชัน Cloud ของ Firebase ใช้งานได้ โดยทำดังนี้
- หากต้องการจัดการและตรวจสอบผู้ออกโทเค็น โปรดดูหัวข้อจัดการตัวเลือกรันไทม์และการติดตั้งใช้งานฟังก์ชัน
$ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
$ firebase deploy --only functions
ตั้งค่าข้อจำกัดเริ่มต้น
คุณใช้ข้อจำกัดเริ่มต้นได้ก่อนที่จะบูตเครื่องครั้งแรก ทําเช่นนี้กับการวางซ้อนทรัพยากรแบบคงที่เพื่อลบล้างค่าเริ่มต้นในเฟรมเวิร์ก Android คุณใช้ข้อจำกัดกับผู้ใช้แต่ละประเภทได้ ดูข้อมูลเกี่ยวกับผู้ใช้ประเภทต่างๆ ได้ที่การสนับสนุนผู้ใช้หลายคน
คุณกำหนดค่าข้อจำกัดเริ่มต้นสำหรับผู้ใช้ระบบแบบ headless ได้ด้วยconfig_defaultFirstUserRestrictions
string-array ใน frameworks/base/core/res/res/values/config.xml
การตั้งค่าข้อจำกัดนี้จะปิดใช้ Android Debug Bridge (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>