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

ใช้วิธีการในหน้านี้เพื่อผสานรวมตัวควบคุมข้อจํากัดการแก้ไขข้อบกพร่อง 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

  1. หากต้องการสร้างโปรเจ็กต์ Firebase โปรดดูหัวข้อเพิ่ม Firebase ลงในโปรเจ็กต์ Android
  2. หากต้องการเปิดใช้โปรแกรมตรวจสอบสิทธิ์ Firebase บางรายการ โปรดดูหัวข้อฉันจะเริ่มต้นใช้งานการตรวจสอบสิทธิ์ Firebase ได้จากที่ใด
  3. หากต้องการเพิ่ม Firebase Cloud Function ที่ว่างเปล่า โปรดดูหัวข้อเริ่มต้นใช้งาน
  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 ระบุว่ามีการใช้ใบรับรองรูทของ CA แบบ Self-signed หรือไม่ หากเปิดใช้ แอป 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_EMAIL: ข้อมูลเข้าสู่ระบบสำหรับบัญชีทดสอบ บิลด์แก้ไขข้อบกพร่องเท่านั้น
  6. หากต้องการสร้างแอปด้วย Gradle ให้เรียกใช้คําสั่งดังนี้
    $ ./gradlew build

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

ผู้ออกโทเค็นอ้างอิงคือ Firebase Cloud Function ที่ติดตั้งใช้งานใน 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. ทำให้ฟังก์ชัน Cloud ของ Firebase ใช้งานได้ โดยทำดังนี้
  5. $ firebase deploy --only functions
  6. หากต้องการจัดการและตรวจสอบผู้ออกโทเค็น โปรดดูหัวข้อจัดการตัวเลือกรันไทม์และการติดตั้งใช้งานฟังก์ชัน

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

คุณใช้ข้อจำกัดเริ่มต้นได้ก่อนที่จะบูตเครื่องครั้งแรก ทําเช่นนี้กับการวางซ้อนทรัพยากรแบบคงที่เพื่อลบล้างค่าเริ่มต้นในเฟรมเวิร์ก 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>