Gunakan petunjuk di halaman ini untuk mengintegrasikan Pengontrol Batasan Proses Debug (DRC) AAOS.
Gambar 1. Contoh aplikasi DRC.
Arsitektur
Arsitektur DRC diilustrasikan dalam Gambar 2. Komponen yang digarisbawahi dengan warna merah (penerbit token dan DRC) memiliki implementasi referensi yang dapat Anda sesuaikan.
Gambar 2. Arsitektur DRC.
Apa yang dimaksud dengan 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, lalu
menerapkan perubahan batasan proses debug seperti yang ditentukan 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 implementasi referensi di packages/apps/Car/DebuggingRestrictionController/server
). Layanan web referensi adalah fungsi Firebase Cloud yang dapat di-deploy (untuk mempelajari lebih lanjut, lihat Cloud Functions for Firebase).
Prasyarat
Sebelum men-deploy implementasi referensi, pastikan Anda menyelesaikan tugas berikut.
Menyiapkan sertifikat untuk menandatangani token akses
Penerbit token membuat JSON Web Signature (JWS) sebagai token akses. Untuk kompatibilitas optimal, 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 standar 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 mempertahankan rantai sertifikat Anda sendiri menggunakan sertifikat root CA yang ditandatangani sendiri atau Hardware Security Module. Sertifikat entitas akhir harus berupa sertifikat X509v3 dengan ekstensi Nama Alternatif Subjek (SAN). Ekstensi SAN berisi ID (misalnya, nama host) dari penerbit token. Terakhir, sertifikat RSA harus lebih diutamakan 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:
- Untuk membuat project Firebase, lihat Menambahkan Firebase ke project Android.
- Untuk mengaktifkan beberapa pengautentikasi Firebase, lihat Mulai menggunakan Firebase Authentication?.
- Untuk menambahkan fungsi Firebase Cloud yang kosong, lihat Memulai.
- Jika belum melakukannya, 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 di-build
dipaketkan di AOSP dengan Soong atau
di-unbundle dengan Gradle.
Build gabungan
Untuk mem-build aplikasi yang dipaketkan:
- Salin
applicationId
,projectId
, danapiKey
darigoogle-services.json
kepackages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java
. Tindakan ini memungkinkan aplikasi DRC terhubung ke Firebase dengan benar. - Perbarui konstanta ini di
packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java
:TOKEN_USES_SELF_SIGNED_CA
menunjukkan apakah sertifikat root CA yang ditandatangani sendiri digunakan. Jika diaktifkan, aplikasi DRC hanya memercayai sertifikat root CA yang dienkode PEM yang ditentukan diROOT_CA_CERT
.TOKEN_ISSUER_API_NAME
adalah nama fungsi Cloud Firebase dan harus cocok dengan fungsi Cloud yang Anda buat sebelumnya di Firebase Console.TOKEN_ISSUER_HOSTNAME
harus cocok dengan Nama Alternatif Subjek dalam sertifikat entitas akhir yang akan menandatangani token akses.DRC_TEST_EMAIL
danDRC_TEST_PASSWORD
adalah kredensial untuk akun pengujian opsional, yang dapat disediakan sebelumnya di Firebase jika Anda telah mengaktifkan login Email/Sandi. Ini hanya digunakan untuk pengujian berinstrumen.
Aplikasi kini dikonfigurasi untuk menggunakan akun Firebase dan sertifikat Anda.
Di Android 9 dan yang lebih tinggi, Anda harus menyiapkan
izin yang diizinkan dengan hak istimewa.
Daftar yang diizinkan harus berisi minimal 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:
- Pastikan Anda telah menginstal Android SDK.
- Buat file teks bernama
local.properties
di direktori utama aplikasi. - Tetapkan lokasi Android SDK:
sdk.dir=path/to/android/sdk
- Untuk menyiapkan Firebase, salin
google-services.json
kepackages/apps/Car/DebuggingRestrictionController/app
. Gradle mengurai file dan menyiapkan sisanya secara otomatis. - Tentukan variabel lingkungan. Seperti 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 Cloud Firebase;$TOKEN_ISSUER_HOST_NAME
: SAN dalam sertifikat;$DRC_TEST_EMAIL
dan$DRC_TEST_EMAI
L: kredensial untuk akun pengujian, khusus build debug.
- Untuk mem-build aplikasi dengan Gradle, jalankan perintah seperti ini:
$ ./gradlew build
Mengintegrasikan penerbit token
Penerbit token referensi adalah Firebase Cloud Function yang diterapkan di Node.js
.
Fungsi ini hanya dapat dipanggil oleh pengguna yang diautentikasi. Sebelum men-deploy aplikasi, Anda harus menyiapkan
kunci pribadi dan sertifikat yang digunakan untuk menandatangani token JWS.
- 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 root CA di bagian akhir. Periode habis masa berlaku dapat disesuaikan dan dapat ditetapkan ke durasi yang lebih lama jika token yang diterbitkan memerlukan waktu beberapa saat sebelum dapat diterima dan digunakan oleh aplikasi DRC. Pencabutan token tidak didukung.
- Upload konfigurasi ke Firebase:
- Men-deploy Firebase Cloud Function:
- Untuk mengelola dan memantau penerbit token, lihat Mengelola opsi runtime dan deployment fungsi.
$ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
$ firebase deploy --only functions
Menetapkan batasan default
Pembatasan default dapat diterapkan sebelum booting pertama. Lakukan ini dengan overlay resource statis untuk mengganti default di framework Android. Batasan dapat diterapkan secara terpisah 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 pembatasan ini
akan 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 reguler (misalnya, pengemudi dan penumpang),
dan tamu dapat dikonfigurasi di
frameworks/base/core/res/res/xml/config_user_types.xml
. Anda dapat menempatkan string ini
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>