Panduan integrasi Pengontrol Batasan Proses Debug

Gunakan petunjuk di halaman ini untuk mengintegrasikan Pengontrol Pembatasan Proses Debug AAOS (RDK).

Gambar 1. Contoh aplikasi DRC.

Arsitektur

Arsitektur DRC diilustrasikan pada Gambar 2. Komponen ditandai dengan warna merah (penerbit token dan DRC) memiliki penerapan referensi pendamping 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 proses debug seperti yang ditetapkan dalam token. Logika ini mencakup elemen UX dasar di sisi mobil.

Apa yang dimaksud dengan penerbit token?

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

Prasyarat

Sebelum men-deploy implementasi referensi, pastikan untuk menyelesaikan tugas-tugas berikut.

Menyiapkan sertifikat untuk menandatangani token akses

Penerbit token membuat JSON Web Signatures (JWS) sebagai token akses. Untuk optimal kompatibilitas, penerbit referensi hanya mendukung algoritma RS256 (tanda tangan RSA dengan SHA256). Untuk memfasilitasi rotasi kunci, gunakan rantai sertifikat, bukan satu sertifikat, untuk menandatangani token akses. Rantai sertifikat yang khas harus terdiri dari sertifikat CA {i>root<i}, sebuah sertifikat CA perantara, dan sertifikat entitas akhir.

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

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

Menyiapkan Firebase

yang digunakan oleh penerbit token referensi Firebase Authentication dan Firebase Cloud Function.

Untuk menyiapkan akun Firebase:

  1. Untuk membuat project Firebase, lihat Tambahkan Firebase ke project Android Anda.
  2. Untuk mengaktifkan beberapa pengautentikasi Firebase, lihat Di mana saya dapat memulai dengan Firebase Authentication?.
  3. Untuk menambahkan fungsi Firebase Cloud kosong, lihat Dapatkan Dimulai.
  4. Jika belum dilakukan, instal alat Node.js, NPM, dan Firebase untuk mengompilasi dan men-deploy penerbit token.

Mengintegrasikan aplikasi DRC

Aplikasi DRC referensi terletak di packages/apps/Car/DebuggingRestrictionController. Aplikasi dapat dibangun dipaketkan di AOSP dengan Soong atau unbundled dengan Gradle.

Build yang dipaketkan

Untuk membuat aplikasi yang dipaketkan:

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

Aplikasi kini dikonfigurasi untuk menggunakan akun Firebase dan sertifikat Anda. Di Android 9 dan yang lebih tinggi, Anda harus menyiapkan pemberian izin dengan hak istimewa yang lebih tinggi. Daftar yang diizinkan harus berisi setidaknya android.permission.MANAGE_USERS. 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 dipaketkan

Build DRC yang tidak dipaketkan menggunakan Gradle untuk mengompilasi aplikasi.

Untuk membuat build yang tidak dipaketkan:

  1. Pastikan Anda telah menginstal Android SDK.
  2. Buat file teks bernama local.properties di direktori utama aplikasi.
  3. Tetapkan lokasi Android SDK:
     sdk.dir=path/to/android/sdk
    
  4. Untuk menyiapkan Firebase, salin google-services.json ke packages/apps/Car/DebuggingRestrictionController/app. Gradle mengurai file dan secara otomatis mengatur sisanya.
  5. Menentukan variabel lingkungan. Seperti halnya build yang dipaketkan, Anda harus menentukan:
    • $TOKEN_USES_SELF_SIGNED_CA: benar atau salah;
    • $ROOT_CA_CERT: jalur ke sertifikat CA root yang dienkode PEM;
    • $TOKEN_ISSUER_API_NAME: nama fungsi Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME: SAN dalam sertifikat;
    • $DRC_TEST_EMAIL dan $DRC_TEST_EMAIL: kredensial untuk pengujian hanya build 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 terautentikasi. Sebelum men-deploy aplikasi, Anda harus menetapkan 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 diurutkan dengan sertifikat entitas akhir terlebih dahulu dan sertifikat CA root di akhir. Periode habis masa berlaku dapat disesuaikan dan memiliki durasi yang lebih lama jika token yang dikeluarkan membutuhkan waktu beberapa saat sebelum dapat diterima dan digunakan oleh aplikasi DRC. {i>Token<i} pencabutan tidak didukung.

  2. Upload konfigurasi ke Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Deploy fungsi Firebase Cloud:
  5. $ firebase deploy --only functions
    
  6. Untuk mengelola dan memantau penerbit token Anda, lihat Kelola deployment fungsi, dan opsi runtime.

Menetapkan batasan default

Pembatasan default dapat diterapkan sebelum booting pertama. Lakukan ini dengan resource statis overlay untuk mengganti default dalam framework Android. Batasan masing-masing dapat berupa diterapkan pada berbagai jenis pengguna. Untuk mempelajari berbagai jenis pengguna, lihat Dukungan Multi-Pengguna.

Batasan default untuk pengguna sistem headless dapat dikonfigurasi dengan array string config_defaultFirstUserRestrictions di frameworks/base/core/res/res/values/config.xml. Menetapkan batasan ini otomatis menonaktifkan Android Debug Bridge (ADB) hingga pembatasan itu dihapus, untuk contoh:

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

Pembatasan default untuk pengguna reguler (misalnya, pengemudi dan penumpang), dan tamu dapat dikonfigurasi di frameworks/base/core/res/res/xml/config_user_types.xml. Anda dapat menempatkan string untuk menetapkan batasan default pada setiap jenis pengguna, 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>