Gambar OS Android menggunakan tanda tangan kriptografi di dua tempat:
- Setiap file
.apk
di dalam gambar harus ditandatangani. Pengelola Paket Android menggunakan tanda tangan.apk
dalam dua cara:- Saat aplikasi diganti, itu harus ditandatangani dengan kunci yang sama dengan aplikasi lama untuk mendapatkan akses ke data aplikasi lama. Ini berlaku baik untuk memperbarui aplikasi pengguna dengan menimpa
.apk
, dan untuk mengganti aplikasi sistem dengan versi yang lebih baru yang diinstal di bawah/data
. - Jika dua atau lebih aplikasi ingin berbagi ID pengguna (sehingga mereka dapat berbagi data, dll.), mereka harus ditandatangani dengan kunci yang sama.
- Saat aplikasi diganti, itu harus ditandatangani dengan kunci yang sama dengan aplikasi lama untuk mendapatkan akses ke data aplikasi lama. Ini berlaku baik untuk memperbarui aplikasi pengguna dengan menimpa
- Paket pembaruan OTA harus ditandatangani dengan salah satu kunci yang diharapkan oleh sistem atau proses instalasi akan menolaknya.
Lepaskan kunci
Pohon Android menyertakan kunci uji di bawah build/target/product/security
. Membangun image OS Android menggunakan make
akan menandatangani semua file .apk
menggunakan tombol uji. Karena kunci uji diketahui publik, siapa pun dapat menandatangani file .apk mereka sendiri dengan kunci yang sama, yang memungkinkan mereka mengganti atau membajak aplikasi sistem yang ada di dalam citra OS Anda. Untuk alasan ini, sangat penting untuk menandatangani setiap citra OS Android yang dirilis atau disebarkan secara publik dengan serangkaian kunci rilis khusus yang hanya dapat diakses oleh Anda.
Untuk membuat kumpulan kunci pelepas unik Anda sendiri, jalankan perintah ini dari akar pohon Android Anda:
subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
mkdir ~/.android-certs
for x in releasekey platform shared media networkstack; do \ ./development/tools/make_key ~/.android-certs/$x "$subject"; \ done
$subject
harus diubah untuk mencerminkan informasi organisasi Anda. Anda dapat menggunakan direktori apa pun, tetapi berhati-hatilah untuk memilih lokasi yang dicadangkan dan aman. Beberapa vendor memilih untuk mengenkripsi kunci pribadi mereka dengan frasa sandi yang kuat dan menyimpan kunci terenkripsi di kontrol sumber; yang lain menyimpan kunci pelepas mereka di tempat lain sama sekali, seperti di komputer dengan celah udara.
Untuk menghasilkan gambar rilis, gunakan:
make dist
sign_target_files_apks \ -o \ # explained in the next section --default_key_mappings ~/.android-certs out/dist/*-target_files-*.zip \ signed-target_files.zip
Skrip sign_target_files_apks
mengambil file target .zip
sebagai input dan menghasilkan file target baru .zip
di mana semua file .apk
telah ditandatangani dengan kunci baru. Gambar yang baru ditandatangani dapat ditemukan di bawah IMAGES/
di signed-target_files.zip
.
Menandatangani paket OTA
Zip file target yang ditandatangani dapat diubah menjadi zip pembaruan OTA yang ditandatangani menggunakan prosedur berikut:
ota_from_target_files \
-k (--package_key)
signed-target_files.zip \
signed-ota_update.zip
Tanda tangan dan sideloading
Sideloading tidak melewati mekanisme verifikasi tanda tangan paket normal pemulihan—sebelum menginstal sebuah paket, pemulihan akan memverifikasi bahwa paket tersebut ditandatangani dengan salah satu kunci pribadi yang cocok dengan kunci publik yang disimpan di partisi pemulihan, seperti halnya untuk paket yang dikirimkan melalui -udara.
Paket pembaruan yang diterima dari sistem utama biasanya diverifikasi dua kali: sekali oleh sistem utama, menggunakan metode RecoverySystem.verifyPackage()
di Android API, dan sekali lagi oleh pemulihan. RecoverySystem API memeriksa tanda tangan terhadap kunci publik yang disimpan di sistem utama, dalam file /system/etc/security/otacerts.zip
(secara default). Pemulihan memeriksa tanda tangan terhadap kunci publik yang disimpan dalam disk RAM partisi pemulihan, dalam file /res/keys
.
Secara default, file target .zip
yang dihasilkan oleh build menyetel sertifikat OTA agar sesuai dengan kunci pengujian. Pada gambar yang dirilis, sertifikat yang berbeda harus digunakan agar perangkat dapat memverifikasi keaslian paket pembaruan. Meneruskan tanda -o
ke sign_target_files_apks
, seperti yang ditunjukkan di bagian sebelumnya, menggantikan sertifikat kunci pengujian dengan sertifikat kunci rilis dari direktori sertifikat Anda.
Biasanya citra sistem dan citra pemulihan menyimpan set kunci publik OTA yang sama. Dengan menambahkan kunci hanya ke kumpulan kunci pemulihan, dimungkinkan untuk menandatangani paket yang hanya dapat diinstal melalui sideloading (dengan asumsi mekanisme pengunduhan pembaruan sistem utama melakukan verifikasi dengan benar terhadap otacerts.zip). Anda dapat menentukan kunci tambahan untuk disertakan hanya dalam pemulihan dengan menyetel variabel PRODUCT_EXTRA_RECOVERY_KEYS dalam definisi produk Anda:
vendor/yoyodyne/tardis/products/tardis.mk
[...] PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload
Ini termasuk vendor/yoyodyne/security/tardis/sideload.x509.pem
dalam file kunci pemulihan sehingga dapat menginstal paket yang ditandatangani dengannya. Kunci tambahan tidak disertakan dalam otacerts.zip, jadi sistem yang memverifikasi paket yang diunduh dengan benar tidak meminta pemulihan untuk paket yang ditandatangani dengan kunci ini.
Sertifikat dan kunci pribadi
Setiap kunci memiliki dua file: sertifikat , yang memiliki ekstensi .x509.pem, dan kunci pribadi , yang memiliki ekstensi .pk8. Kunci pribadi harus dirahasiakan dan diperlukan untuk menandatangani sebuah paket. Kunci itu sendiri mungkin dilindungi oleh kata sandi. Sertifikat, sebaliknya, hanya berisi setengah dari kunci publik, sehingga dapat didistribusikan secara luas. Ini digunakan untuk memverifikasi sebuah paket telah ditandatangani oleh kunci pribadi yang sesuai.
Build Android standar menggunakan lima kunci, yang semuanya berada di build/target/product/security
:
- kunci tes
- Kunci default generik untuk paket yang tidak menentukan kunci.
- peron
- Kunci uji untuk paket yang merupakan bagian dari platform inti.
- bersama
- Uji kunci untuk hal-hal yang dibagikan dalam proses rumah/kontak.
- media
- Kunci uji untuk paket yang merupakan bagian dari sistem media/unduh.
Paket individual menentukan salah satu kunci ini dengan menyetel LOCAL_CERTIFICATE di file Android.mk mereka. (testkey digunakan jika variabel ini tidak disetel.) Anda juga dapat menentukan kunci yang sama sekali berbeda dengan nama path, misalnya:
device/yoyodyne/apps/SpecialApp/Android.mk
[...] LOCAL_CERTIFICATE := device/yoyodyne/security/special
Sekarang build menggunakan device/yoyodyne/security/special.{x509.pem,pk8}
untuk menandatangani SpecialApp.apk. Build hanya dapat menggunakan kunci pribadi yang tidak dilindungi kata sandi.
Opsi penandatanganan lanjutan
Penggantian kunci penandatanganan APK
Skrip penandatanganan sign_target_files_apks
berfungsi pada file target yang dibuat untuk build. Semua informasi tentang sertifikat dan kunci pribadi yang digunakan pada waktu pembuatan disertakan dalam file target. Saat menjalankan skrip penandatanganan untuk menandatangani rilis, kunci penandatanganan dapat diganti berdasarkan nama kunci atau nama APK.
Gunakan --key_mapping
dan --default_key_mappings
untuk menentukan penggantian kunci berdasarkan nama kunci:
-
--key_mapping src_key = dest_key
menentukan penggantian untuk satu kunci pada satu waktu. - Bendera
--default_key_mappings dir
menentukan direktori dengan lima kunci untuk mengganti semua kunci dibuild/target/product/security
; itu setara dengan menggunakan--key_mapping
lima kali untuk menentukan pemetaan.
build/target/product/security/testkey = dir/releasekey build/target/product/security/platform = dir/platform build/target/product/security/shared = dir/shared build/target/product/security/media = dir/media build/target/product/security/networkstack = dir/networkstack
Gunakan --extra_apks apk_name1,apk_name2,... = key
untuk menentukan penggantian kunci penandatanganan berdasarkan nama APK. Jika key
dibiarkan kosong, skrip akan memperlakukan APK yang ditentukan sebagai yang telah ditandatangani sebelumnya.
Untuk produk tardis hipotetis, Anda memerlukan enam kunci yang dilindungi kata sandi: lima untuk mengganti lima di build/target/product/security
, dan satu untuk mengganti device/yoyodyne/security/special
yang dibutuhkan oleh SpecialApp dalam contoh di atas. Jika kuncinya ada di file berikut:
vendor/yoyodyne/security/tardis/releasekey.x509.pem vendor/yoyodyne/security/tardis/releasekey.pk8 vendor/yoyodyne/security/tardis/platform.x509.pem vendor/yoyodyne/security/tardis/platform.pk8 vendor/yoyodyne/security/tardis/shared.x509.pem vendor/yoyodyne/security/tardis/shared.pk8 vendor/yoyodyne/security/tardis/media.x509.pem vendor/yoyodyne/security/tardis/media.pk8 vendor/yoyodyne/security/tardis/networkstack.x509.pem vendor/yoyodyne/security/tardis/networkstack.pk8 vendor/yoyodyne/security/special.x509.pem vendor/yoyodyne/security/special.pk8 # NOT password protected vendor/yoyodyne/security/special-release.x509.pem vendor/yoyodyne/security/special-release.pk8 # password protected
Kemudian Anda akan menandatangani semua aplikasi seperti ini:
./build/make/tools/releasetools/sign_target_files_apks \
--default_key_mappings vendor/yoyodyne/security/tardis \
--key_mapping vendor/yoyodyne/security/special=vendor/yoyodyne/security/special-release \
--extra_apks PresignedApp= \
-o tardis-target_files.zip \
signed-tardis-target_files.zip
Ini memunculkan hal berikut:
Enter password for vendor/yoyodyne/security/special-release key> Enter password for vendor/yoyodyne/security/tardis/networkstack key> Enter password for vendor/yoyodyne/security/tardis/media key> Enter password for vendor/yoyodyne/security/tardis/platform key> Enter password for vendor/yoyodyne/security/tardis/releasekey key> Enter password for vendor/yoyodyne/security/tardis/shared key> signing: Phone.apk (vendor/yoyodyne/security/tardis/platform) signing: Camera.apk (vendor/yoyodyne/security/tardis/media) signing: NetworkStack.apk (vendor/yoyodyne/security/tardis/networkstack) signing: Special.apk (vendor/yoyodyne/security/special-release) signing: Email.apk (vendor/yoyodyne/security/tardis/releasekey) [...] signing: ContactsProvider.apk (vendor/yoyodyne/security/tardis/shared) signing: Launcher.apk (vendor/yoyodyne/security/tardis/shared) NOT signing: PresignedApp.apk (skipped due to special cert string) rewriting SYSTEM/build.prop: replace: ro.build.description=tardis-user Eclair ERC91 15449 test-keys with: ro.build.description=tardis-user Eclair ERC91 15449 release-keys replace: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/test-keys with: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/release-keys signing: framework-res.apk (vendor/yoyodyne/security/tardis/platform) rewriting RECOVERY/RAMDISK/default.prop: replace: ro.build.description=tardis-user Eclair ERC91 15449 test-keys with: ro.build.description=tardis-user Eclair ERC91 15449 release-keys replace: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/test-keys with: ro.build.fingerprint=generic/tardis/tardis/tardis:Eclair/ERC91/15449:user/release-keys using: vendor/yoyodyne/security/tardis/releasekey.x509.pem for OTA package verification done.
Setelah meminta kata sandi kepada pengguna untuk semua kunci yang dilindungi kata sandi, skrip menandatangani ulang semua file APK di target input .zip
dengan kunci rilis. Sebelum menjalankan perintah, Anda juga dapat mengatur variabel lingkungan ANDROID_PW_FILE
ke nama file sementara; skrip kemudian memanggil editor Anda untuk mengizinkan Anda memasukkan kata sandi untuk semua kunci (ini mungkin cara yang lebih nyaman untuk memasukkan kata sandi).
Penggantian kunci penandatanganan APEX
Android 10 memperkenalkan format file APEX untuk menginstal modul sistem tingkat rendah. Seperti yang dijelaskan dalam penandatanganan APEX , setiap file APEX ditandatangani dengan dua kunci: satu untuk gambar sistem file mini dalam APEX dan yang lainnya untuk seluruh APEX.
Saat menandatangani rilis, dua kunci penandatanganan untuk file APEX diganti dengan kunci rilis. Kunci payload sistem file ditentukan dengan flag --extra_apex_payload
dan seluruh kunci penandatanganan file APEX ditentukan dengan flag --extra_apks
.
Untuk produk tardis, asumsikan Anda memiliki konfigurasi kunci berikut untuk file com.android.conscrypt.apex
, com.android.media.apex
, dan com.android.runtime.release.apex
.
name="com.android.conscrypt.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" name="com.android.media.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" name="com.android.runtime.release.apex" public_key="vendor/yoyodyne/security/testkeys/com.android.runtime.avbpubkey" private_key="vendor/yoyodyne/security/testkeys/com.android.runtime.pem" container_certificate="vendor/yoyodyne/security/testkeys/com.google.android.runtime.release_container.x509.pem" container_private_key="vendor/yoyodyne/security/testkeys/com.google.android.runtime.release_container.pk8"
Dan Anda memiliki file berikut yang berisi kunci rilis:
vendor/yoyodyne/security/runtime_apex_container.x509.pem vendor/yoyodyne/security/runtime_apex_container.pk8 vendor/yoyodyne/security/runtime_apex_payload.pem
Perintah berikut menimpa kunci penandatanganan untuk com.android.runtime.release.apex
dan com.android.tzdata.apex
selama penandatanganan rilis. Secara khusus, com.android.runtime.release.apex
ditandatangani dengan kunci rilis yang ditentukan ( runtime_apex_container
untuk file APEX, dan runtime_apex_payload
untuk file image payload). com.android.tzdata.apex
diperlakukan sebagai pra-tanda tangan. Semua file APEX lainnya ditangani oleh konfigurasi default seperti yang tercantum dalam file target.
./build/make/tools/releasetools/sign_target_files_apks \
--default_key_mappings vendor/yoyodyne/security/tardis \
--extra_apks com.android.runtime.release.apex=vendor/yoyodyne/security/runtime_apex_container \
--extra_apex_payload_key com.android.runtime.release.apex=vendor/yoyodyne/security/runtime_apex_payload.pem \
--extra_apks com.android.media.apex= \
--extra_apex_payload_key com.android.media.apex= \
-o tardis-target_files.zip \
signed-tardis-target_files.zip
Menjalankan perintah di atas memberikan log berikut:
[...] signing: com.android.runtime.release.apex container (vendor/yoyodyne/security/runtime_apex_container) : com.android.runtime.release.apex payload (vendor/yoyodyne/security/runtime_apex_payload.pem) NOT signing: com.android.conscrypt.apex (skipped due to special cert string) NOT signing: com.android.media.apex (skipped due to special cert string) [...]
Pilihan lain
Skrip penandatanganan sign_target_files_apks
menulis ulang deskripsi build dan sidik jari dalam file properti build untuk mencerminkan bahwa build adalah build yang ditandatangani. Bendera --tag_changes
mengontrol pengeditan apa yang dilakukan pada sidik jari. Jalankan skrip dengan -h
untuk melihat dokumentasi pada semua flag.
Membuat kunci secara manual
Android menggunakan kunci RSA 2048-bit dengan eksponen publik 3. Anda dapat membuat pasangan kunci sertifikat/pribadi menggunakan alat openssl dari openssl.org :
# generate RSA keyopenssl genrsa -3 -out temp.pem 2048
Generating RSA private key, 2048 bit long modulus ....+++ .....................+++ e is 3 (0x3) # create a certificate with the public part of the keyopenssl req -new -x509 -key temp.pem -out releasekey.x509.pem -days 10000 -subj '/C=US/ST=California/L=San Narciso/O=Yoyodyne, Inc./OU=Yoyodyne Mobility/CN=Yoyodyne/emailAddress=yoyodyne@example.com'
# create a PKCS#8-formatted version of the private keyopenssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt
# securely delete the temp.pem fileshred --remove temp.pem
Perintah openssl pkcs8 yang diberikan di atas membuat file .pk8 tanpa kata sandi, cocok untuk digunakan dengan sistem pembangunan. Untuk membuat .pk8 yang diamankan dengan kata sandi (yang harus Anda lakukan untuk semua kunci rilis aktual), ganti argumen -nocrypt
dengan -passout stdin
; kemudian openssl akan mengenkripsi kunci pribadi dengan kata sandi yang dibaca dari input standar. Tidak ada prompt yang tercetak, jadi jika stdin adalah terminalnya, program akan tampak hang ketika itu benar-benar hanya menunggu Anda memasukkan kata sandi. Nilai lain dapat digunakan untuk argumen passout untuk membaca kata sandi dari lokasi lain; untuk detailnya, lihat dokumentasi openssl .
File perantara temp.pem berisi kunci pribadi tanpa perlindungan kata sandi apa pun, jadi buanglah dengan bijaksana saat membuat kunci rilis. Secara khusus, utilitas GNUshred mungkin tidak efektif pada jaringan atau sistem file jurnal. Anda dapat menggunakan direktori kerja yang terletak di disk RAM (seperti partisi tmpfs) saat membuat kunci untuk memastikan perantara tidak terekspos secara tidak sengaja.
Membuat file gambar
Setelah Anda menandatangani-target-files.zip, Anda perlu membuat gambar sehingga Anda dapat meletakkannya ke perangkat. Untuk membuat gambar yang ditandatangani dari file target, jalankan perintah berikut dari akar pohon Android:
img_from_target_files signed-target-files.zip signed-img.zipFile yang dihasilkan,
signed-img.zip
, berisi semua file .img. Untuk memuat gambar ke perangkat, gunakan fastboot sebagai berikut:fastboot update signed-img.zip