Panduan Integrasi Pengontrol Batasan Debugging

Gunakan petunjuk berikut untuk mengintegrasikan AAOS Debugging Restriction Controller (DRC).

Gambar 1. Contoh aplikasi DRC

Arsitektur

Arsitektur DRC diilustrasikan di bawah ini. Komponen yang digarisbawahi dengan warna merah (Penerbit Token dan Pengontrol Pembatasan Debut) memiliki implementasi referensi yang dapat Anda sesuaikan.

Gambar 2. Arsitektur DRC

Apa itu DRC?

Head unit mobil menyertakan aplikasi DRC (lihat implementasi referensi di packages/apps/Car/DebuggingRestrictionController ). Aplikasi referensi menyertakan logika untuk menerima token akses dari Penerbit Token, memvalidasi token, dan kemudian menerapkan perubahan pembatasan debug seperti yang ditentukan dalam token. Logikanya mencakup elemen UX dasar di sisi mobil.

Apa itu Penerbit Token?

Ini adalah layanan web yang mengeluarkan token akses yang ditandatangani secara kriptografis (lihat implementasi referensi di packages/apps/Car/DebuggingRestrictionController/server ). Layanan web referensi adalah fungsi Firebase Cloud yang dapat diterapkan (untuk mempelajari lebih lanjut, lihat Cloud Functions for Firebase ).

Prasyarat

Sebelum Anda menerapkan implementasi referensi, pastikan untuk menyelesaikan tugas-tugas berikut.

Mempersiapkan sertifikat untuk menandatangani token akses

Penerbit Token menghasilkan JSON Web Signatures (JWS) sebagai token akses. Untuk kompatibilitas optimal, penerbit referensi hanya mendukung algoritme RS256 (tanda tangan RSA dengan SHA256). Untuk memfasilitasi rotasi kunci, gunakan rantai sertifikat alih-alih satu sertifikat untuk menandatangani token akses. Rantai sertifikat tipikal harus terdiri dari sertifikat CA root, sertifikat CA perantara, dan sertifikat entitas akhir.

Sertifikat entitas akhir yang menandatangani token JWS tidak berbeda dengan sertifikat TLS standar. Anda dapat membeli sertifikat dari CA publik seperti DigiCert atau memelihara rantai sertifikat Anda sendiri menggunakan sertifikat CA root yang ditandatangani sendiri atau Modul Keamanan Perangkat Keras. Sertifikat entitas akhir harus berupa sertifikat X509v3 dengan ekstensi Nama Alternatif Subjek (SAN). Ekstensi SAN berisi pengenal (misalnya, nama host) dari penerbit token. Terakhir, sertifikat RSA harus lebih disukai daripada sertifikat EC karena penerbit token hanya mendukung RS256.

Google menyediakan skrip shell untuk membuat sertifikat yang ditandatangani sendiri di packages/apps/Car/DebuggingRestrictionController/server/genkey.sh .

Menyiapkan Firebase

Penerbit Token referensi menggunakan Firebase Authentication dan Firebase Cloud Function .

Untuk menyiapkan akun Firebase Anda:

  1. Untuk membuat proyek Firebase, lihat Menambahkan Firebase ke proyek Android Anda .
  2. Untuk mengaktifkan beberapa autentikator Firebase, lihat Di mana saya memulai dengan Firebase Authentication? .
  3. Untuk menambahkan fungsi Firebase Cloud yang kosong, lihat Memulai .
  4. Jika belum selesai, instal Node.js, NPM, dan Firebase Tools untuk mengompilasi dan menerapkan Penerbit Token.

Mengintegrasikan aplikasi DRC

Aplikasi DRC referensi terletak di packages/apps/Car/DebuggingRestrictionController . Aplikasi ini dapat dibuat dalam bundel AOSP dengan Soong atau tidak dibundel dengan Gradle .

Dibundel membangun

Untuk membangun aplikasi yang dibundel:

  1. Salin applicationId , projectId , dan apiKey dari google-services.json ke dalam packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java . Melakukannya memungkinkan aplikasi DRC terhubung dengan benar ke Firebase.
  2. Perbarui konstanta ini di packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java :
    • TOKEN_USES_SELF_SIGNED_CA menunjukkan apakah sertifikat CA root yang ditandatangani sendiri digunakan. Jika diaktifkan, aplikasi DRC hanya memercayai sertifikat CA root berenkode PEM yang ditentukan dalam ROOT_CA_CERT .
    • TOKEN_ISSUER_API_NAME adalah nama fungsi Firebase Cloud dan harus cocok dengan fungsi Cloud yang Anda buat sebelumnya di Firebase Console.
    • TOKEN_ISSUER_HOSTNAME harus cocok dengan Nama Alternatif Subjek di sertifikat entitas akhir yang akan menandatangani token akses.
    • DRC_TEST_EMAIL dan DRC_TEST_PASSWORD adalah kredensial untuk akun pengujian opsional, yang dapat disediakan sebelumnya di Firebase jika Anda telah mengaktifkan login dengan Email/Sandi. Ini digunakan untuk tes instrumentasi saja.

Aplikasi sekarang dikonfigurasi untuk menggunakan akun Firebase dan sertifikat Anda. Di Android 9 dan yang lebih tinggi, Anda harus menyiapkan Daftar Izin Hak Istimewa . Daftar yang diizinkan harus berisi setidaknya android.permission.MANAGE_USERS . Sebagai contoh:

<permissions>
  <privapp-permissions package="com.android.car.debuggingrestrictioncontroller">
    <permission name="android.permission.INTERNET"/>
    <permission name="android.permission.MANAGE_USERS"/>
  </privapp-permissions>
</permissions>

Build yang Tidak Dibundel

Build DRC yang tidak dibundel menggunakan Gradle untuk mengompilasi aplikasi.

Untuk membuat build yang tidak dibundel:

  1. Konfirmasikan bahwa Anda telah menginstal Android SDK.
  2. Buat file teks bernama local.properties di direktori root aplikasi.
  3. Setel lokasi Android SDK:
     sdk.dir=path/to/android/sdk
    
  4. Untuk menyiapkan Firebase, salin google-services.json ke packages/apps/Car/DebuggingRestrictionController/app . Gradle mem-parsing file dan secara otomatis menyiapkan sisanya.
  5. Tentukan variabel lingkungan. Seperti halnya build yang dibundel, Anda harus menentukan:
    • $TOKEN_USES_SELF_SIGNED_CA : benar atau salah;
    • $ROOT_CA_CERT : jalur ke sertifikat CA root yang disandikan PEM;
    • $TOKEN_ISSUER_API_NAME : nama fungsi Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME : SAN dalam sertifikat;
    • $DRC_TEST_EMAIL dan $DRC_TEST_EMAI L: kredensial untuk akun pengujian, hanya pembuatan debug.
  6. Untuk membangun aplikasi dengan Gradle, jalankan perintah seperti ini:
    $ ./gradlew build
    

Mengintegrasikan Penerbit Token

Penerbit Token referensi adalah Firebase Cloud Function yang diimplementasikan di Node.js. Fungsi hanya dapat dipanggil oleh pengguna yang diautentikasi. Sebelum menerapkan aplikasi, Anda harus menyiapkan kunci pribadi dan sertifikat yang digunakan untuk menandatangani token JWS.

  1. Isi file JSON dengan konten berikut:
    {
        "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"
    }
    

    Sertifikat dipesan dengan sertifikat entitas akhir terlebih dahulu dan sertifikat CA root di akhir. Periode kedaluwarsa dapat disesuaikan dan dapat diatur ke durasi yang lebih lama jika token yang diterbitkan membutuhkan waktu sebelum dapat diterima dan digunakan oleh aplikasi DRC. Pencabutan token tidak didukung.

  2. Unggah konfigurasi ke Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Terapkan fungsi Firebase Cloud:
  5. $ firebase deploy --only functions
    
  6. Untuk mengelola dan memantau Penerbit Token Anda, lihat Mengelola penerapan fungsi dan opsi runtime .

Menyetel batasan default

Pembatasan default dapat diterapkan sebelum boot pertama. Lakukan ini dengan hamparan sumber daya statis untuk mengganti default dalam kerangka kerja Android. Pembatasan masing-masing dapat diterapkan pada berbagai jenis pengguna. Untuk mempelajari tentang berbagai jenis pengguna, lihat Dukungan Multi-Pengguna .

Pembatasan default untuk pengguna sistem tanpa kepala dapat dikonfigurasi dengan array string config_defaultFirstUserRestrictions di frameworks/base/core/res/res/values/config.xml . Menyetel pembatasan ini secara otomatis menonaktifkan Android Debug Bridge (ADB) hingga pembatasan dihapus, misalnya:

<string-array translatable="false" name="config_defaultFirstUserRestrictions">
  <item>no_debugging_features</item>
</string-array>

Pembatasan default untuk pengguna biasa (misalnya, pengemudi dan penumpang), dan tamu dapat dikonfigurasi di frameworks/base/core/res/res/xml/config_user_types.xml . Anda dapat melapisi string ini untuk menetapkan batasan default pada setiap jenis pengguna masing-masing, misalnya:

<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>