คู่มือการรวมตัวควบคุมข้อจำกัดการแก้ไขจุดบกพร่อง

ใช้คำแนะนำในหน้านี้เพื่อรวม 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 ของคุณ:

  1. หากต้องการสร้างโปรเจ็กต์ Firebase โปรดดู เพิ่ม Firebase ให้กับโปรเจ็กต์ Android ของคุณ
  2. หากต้องการเปิดใช้งานการรับรองความถูกต้องของ Firebase บางตัว โปรดดูที่ ฉันจะเริ่มต้นด้วยการรับรองความถูกต้องของ Firebase ได้ที่ไหน .
  3. หากต้องการเพิ่มฟังก์ชัน Firebase Cloud ที่ว่างเปล่า โปรดดู เริ่มต้นใช้งาน
  4. หากยังไม่ได้ดำเนินการ ให้ติดตั้งเครื่องมือ Node.js , NPM และ Firebase เพื่อคอมไพล์และปรับใช้ผู้ออกโทเค็น

บูรณาการแอป DRC

แอป DRC อ้างอิงอยู่ใน packages/apps/Car/DebuggingRestrictionController สามารถสร้างแอป แบบรวมกลุ่ม ใน AOSP กับ Soong หรือ แยกกลุ่ม กับ Gradle

โครงสร้างแบบรวมกลุ่ม

หากต้องการสร้างแอปแบบรวม:

  1. คัดลอก applicationId , projectId และ apiKey จาก google-services.json ลงใน packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java การทำเช่นนี้จะทำให้แอป DRC เชื่อมต่อกับ Firebase ได้อย่างถูกต้อง
  2. อัปเดตค่าคงที่เหล่านี้ใน 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 เพื่อคอมไพล์แอป

หากต้องการสร้างบิลด์ที่ไม่ได้รวมกลุ่ม:

  1. ยืนยันว่าคุณได้ติดตั้ง Android SDK แล้ว
  2. สร้างไฟล์ข้อความชื่อ local.properties ในไดเรกทอรีรากของแอป
  3. ตั้งค่าตำแหน่งของ Android SDK:
     sdk.dir=path/to/android/sdk
    
  4. หากต้องการตั้งค่า Firebase ให้คัดลอก google-services.json ไปที่ packages/apps/Car/DebuggingRestrictionController/app Gradle แยกวิเคราะห์ไฟล์และตั้งค่าส่วนที่เหลือโดยอัตโนมัติ
  5. กำหนดตัวแปรสภาพแวดล้อม เช่นเดียวกับบิลด์แบบรวม คุณต้องระบุ:
    • $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: ข้อมูลรับรองสำหรับบัญชีทดสอบ เฉพาะรุ่นแก้ไขข้อบกพร่องเท่านั้น
  6. หากต้องการสร้างแอปด้วย Gradle ให้รันคำสั่งดังนี้:
    $ ./gradlew build
    

รวมผู้ออกโทเค็น

ผู้ออกโทเค็นอ้างอิงคือฟังก์ชัน Firebase Cloud ที่ใช้งานใน Node.js ฟังก์ชันนี้สามารถเรียกใช้โดยผู้ใช้ที่ได้รับการรับรองความถูกต้องเท่านั้น ก่อนที่จะปรับใช้แอป คุณต้องตั้งค่าคีย์ส่วนตัวและใบรับรองที่ใช้ในการลงนามโทเค็น JWS

  1. เติมไฟล์ 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 จะสามารถรับและใช้ได้ ไม่รองรับการเพิกถอนโทเค็น

  2. อัปโหลดการกำหนดค่าไปยัง Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. ปรับใช้ฟังก์ชัน Firebase Cloud:
  5. $ firebase deploy --only functions
    
  6. หากต้องการจัดการและตรวจสอบผู้ออกโทเค็นของคุณ โปรดดู จัดการตัวเลือกการใช้งานและรันไทม์ของฟังก์ชัน

ตั้งค่าข้อจำกัดเริ่มต้น

สามารถใช้ข้อจำกัดเริ่มต้นก่อนการบู๊ตครั้งแรก ทำสิ่งนี้ด้วยการซ้อนทับทรัพยากรแบบคงที่เพื่อแทนที่ค่าเริ่มต้นในกรอบงาน 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>