ใช้คำแนะนำในหน้านี้เพื่อรวม AAOS Debugging Restriction Controller (DRC)
รูปที่ 1 ตัวอย่างแอป DRC
สถาปัตยกรรม
สถาปัตยกรรม DRC แสดงไว้ในรูปที่ 2 ส่วนประกอบที่ร่างด้วยสีแดง (ผู้ออกโทเค็นและ DRC) มีการใช้งานอ้างอิงที่คุณสามารถปรับแต่งได้
รูปที่ 2 สถาปัตยกรรม DRC
ดีอาร์ซีคืออะไร?
เครื่องเสียงรถยนต์มีแอป DRC (ดูการใช้งานอ้างอิงใน packages/apps/Car/DebuggingRestrictionController
) แอปอ้างอิงมีตรรกะในการรับโทเค็นการเข้าถึงจากผู้ออกโทเค็น ตรวจสอบความถูกต้องของโทเค็น จากนั้นใช้การเปลี่ยนแปลงข้อจำกัดในการแก้ไขจุดบกพร่องตามที่ระบุไว้ในโทเค็น ตรรกะประกอบด้วยองค์ประกอบ UX พื้นฐานที่ฝั่งรถ
ผู้ออกโทเค็นคืออะไร?
นี่คือบริการเว็บที่ออกโทเค็นการเข้าถึงที่ลงนามแบบเข้ารหัส (ดูการใช้งานอ้างอิงใน packages/apps/Car/DebuggingRestrictionController/server
) บริการเว็บอ้างอิงเป็นฟังก์ชัน Firebase Cloud ที่ปรับใช้ได้ (หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ ฟังก์ชันคลาวด์สำหรับ Firebase )
ข้อกำหนดเบื้องต้น
ก่อนที่คุณจะปรับใช้การใช้งานอ้างอิง ต้องแน่ใจว่าได้ทำงานต่อไปนี้ให้เสร็จสิ้น
เตรียมใบรับรองสำหรับการลงนามโทเค็นการเข้าถึง
ผู้ออกโทเค็นจะสร้าง JSON Web Signatures (JWS) เป็นโทเค็นการเข้าถึง เพื่อความเข้ากันได้สูงสุด ผู้ออกอ้างอิงรองรับเฉพาะอัลกอริธึม RS256 เท่านั้น (ลายเซ็น RSA พร้อม SHA256) เพื่ออำนวยความสะดวกในการหมุนเวียนคีย์ ให้ใช้กลุ่มใบรับรองแทนใบรับรองเดียวเพื่อลงนามโทเค็นการเข้าถึง สายใบรับรองทั่วไปควรประกอบด้วยใบรับรอง CA หลัก, ใบรับรอง CA ระดับกลาง และใบรับรองเอนทิตีปลายทาง
ใบรับรองเอนทิตีปลายทางที่ลงนามโทเค็น JWS ไม่แตกต่างจากใบรับรอง TLS มาตรฐาน คุณสามารถซื้อใบรับรองจาก CA สาธารณะ เช่น DigiCert หรือรักษาห่วงโซ่ใบรับรองของคุณเองโดยใช้ใบรับรอง CA รูทที่ลงนามด้วยตนเองหรือโมดูลความปลอดภัยของฮาร์ดแวร์ ใบรับรองเอนทิตีปลายทางควรเป็นใบรับรอง X509v3 ที่มีนามสกุลหัวเรื่องทางเลือก (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 ที่ว่างเปล่า โปรดดู เริ่มต้นใช้งาน
- หากยังไม่ได้ดำเนินการ ให้ติดตั้งเครื่องมือ
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
บ่งชี้ว่ามีการใช้ใบรับรอง Root CA ที่ลงนามด้วยตนเองหรือไม่ หากเปิดใช้งาน แอป DRC จะเชื่อถือเฉพาะใบรับรอง CA หลักที่เข้ารหัสด้วย PEM ที่ระบุในROOT_CA_CERT
-
TOKEN_ISSUER_API_NAME
คือชื่อของฟังก์ชัน Firebase Cloud และควรตรงกับฟังก์ชัน Cloud ที่คุณสร้างไว้ก่อนหน้านี้ในคอนโซล 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
: พาธไปยังใบรับรอง 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 ที่ใช้งานใน 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:
- ปรับใช้ฟังก์ชัน Firebase Cloud:
- หากต้องการจัดการและตรวจสอบผู้ออกโทเค็นของคุณ โปรดดู จัดการตัวเลือกการใช้งานและรันไทม์ของฟังก์ชัน
$ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
$ firebase deploy --only functions
ตั้งค่าข้อจำกัดเริ่มต้น
สามารถใช้ข้อจำกัดเริ่มต้นก่อนการบู๊ตครั้งแรก ทำสิ่งนี้ด้วยการซ้อนทับทรัพยากรแบบคงที่เพื่อแทนที่ค่าเริ่มต้นในกรอบงาน Android ข้อจำกัดสามารถนำไปใช้กับผู้ใช้ประเภทต่างๆ ตามลำดับ หากต้องการเรียนรู้เกี่ยวกับผู้ใช้ประเภทต่างๆ โปรดดูที่ การสนับสนุนผู้ใช้หลายราย
ข้อจำกัดดีฟอลต์สำหรับ ผู้ใช้ระบบ headless สามารถกำหนดค่าได้ด้วยสตริงอาร์เรย์ config_defaultFirstUserRestrictions
ใน 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>