Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menandatangani Build untuk Dirilis

Gambar OS Android menggunakan tanda tangan kriptografi di dua tempat:

  1. Setiap file .apk di dalam gambar harus ditandatangani. Pengelola Paket Android menggunakan tanda tangan .apk dalam dua cara:
    • Ketika sebuah aplikasi diganti, itu harus ditandatangani dengan kunci yang sama dengan aplikasi lama untuk mendapatkan akses ke data aplikasi lama. Hal ini berlaku baik untuk memperbarui aplikasi pengguna dengan menimpa .apk , dan untuk menimpa aplikasi sistem dengan versi yang lebih baru yang dipasang 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.
  2. Paket pembaruan OTA harus ditandatangani dengan salah satu kunci yang diharapkan oleh sistem atau proses instalasi akan menolaknya.

Kunci rilis

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. Karena alasan ini, sangat penting untuk menandatangani gambar OS Android yang dirilis atau diterapkan secara publik dengan sekumpulan kunci rilis khusus yang hanya Anda miliki aksesnya.

Untuk membuat set kunci rilis unik Anda sendiri, jalankan perintah berikut dari root 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 privat mereka dengan frasa sandi yang kuat dan menyimpan kunci terenkripsi di kontrol sumber; yang lain menyimpan kunci pelepas mereka di tempat lain seluruhnya, 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 masukan dan menghasilkan file .zip target baru di mana semua file .apk telah ditandatangani dengan kunci baru. Gambar yang baru ditandatangani dapat ditemukan di IMAGES/ in 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 sideload

Sideload tidak mengabaikan mekanisme verifikasi tanda tangan paket normal pemulihan — sebelum menginstal paket, pemulihan akan memverifikasi bahwa paket ditandatangani dengan salah satu kunci privat yang cocok dengan kunci publik yang disimpan di partisi pemulihan, seperti yang akan dilakukan untuk paket yang dikirimkan melalui -udara.

Paket update yang diterima dari sistem utama biasanya diverifikasi dua kali: sekali oleh sistem utama, menggunakan metode RecoverySystem.verifyPackage() di Android API, dan sekali lagi dengan pemulihan. RecoverySystem API memeriksa tanda tangan terhadap kunci publik yang disimpan di sistem utama, di file /system/etc/security/otacerts.zip (secara default). Pemulihan memeriksa tanda tangan terhadap kunci publik yang disimpan di disk RAM partisi pemulihan, di file /res/keys .

Secara default, target-files .zip dihasilkan oleh build menyetel sertifikat OTA agar cocok dengan kunci pengujian. Pada gambar yang dirilis, sertifikat yang berbeda harus digunakan sehingga perangkat dapat memverifikasi keaslian paket pembaruan. Meneruskan tanda -o ke sign_target_files_apks , seperti yang ditunjukkan di bagian sebelumnya, menggantikan sertifikat kunci uji dengan sertifikat kunci rilis dari direktori certs Anda.

Biasanya citra sistem dan citra pemulihan menyimpan kumpulan kunci publik OTA yang sama. Dengan menambahkan kunci hanya ke set kunci pemulihan, dimungkinkan untuk menandatangani paket yang hanya dapat diinstal melalui sideload (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 mengatur 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 kunci publik vendor/yoyodyne/security/tardis/sideload.x509.pem di file kunci pemulihan sehingga dapat menginstal paket yang ditandatangani dengannya. Kunci ekstra 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 hadir dalam dua file: sertifikat , yang memiliki ekstensi .x509.pem, dan kunci pribadi , yang memiliki ekstensi .pk8. Kunci pribadi harus dirahasiakan dan diperlukan untuk menandatangani paket. Kuncinya sendiri mungkin dilindungi oleh kata sandi. Sertifikat, sebaliknya, hanya berisi setengah dari kunci publik, sehingga dapat didistribusikan secara luas. Ini digunakan untuk memverifikasi paket telah ditandatangani oleh kunci pribadi yang sesuai.

Build Android standar menggunakan lima kunci, yang semuanya berada di build/target/product/security :

testkey
Kunci default umum untuk paket yang sebaliknya tidak menentukan kunci.
peron
Uji kunci 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 / unduhan.
networkstack
Uji kunci untuk paket yang merupakan bagian dari sistem jaringan. Kunci networkstack digunakan untuk menandatangani binari yang dirancang sebagai Komponen Sistem Modular . Jika pembaruan modul Anda dibuat secara terpisah dan terintegrasi sebagai prebuilt pada image perangkat Anda, Anda mungkin tidak perlu membuat kunci networkstack di pohon sumber Android.

Paket individual menentukan salah satu kunci ini dengan menyetel LOCAL_CERTIFICATE di file Android.mk mereka. (tombol uji digunakan jika variabel ini tidak disetel.) Anda juga dapat menentukan kunci yang sama sekali berbeda dengan nama jalur, misalnya:

device/yoyodyne/apps/SpecialApp/Android.mk
 [...]

LOCAL_CERTIFICATE := device/yoyodyne/security/special

Sekarang build tersebut menggunakan kunci 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 sebuah build. Semua informasi tentang sertifikat dan kunci privat 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 tanda --key_mapping dan --default_key_mappings untuk menentukan penggantian kunci berdasarkan nama kunci:

  • --key_mapping src_key = dest_key menentukan penggantian satu kunci dalam satu waktu.
  • Bendera --default_key_mappings dir menetapkan direktori dengan lima kunci untuk menggantikan semua kunci dalam build/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 tanda --extra_apks apk_name1,apk_name2,... = key untuk menentukan penggantian kunci penandatanganan berdasarkan nama APK. Jika key dibiarkan kosong, skrip memperlakukan APK yang ditentukan sebagai ditandatangani sebelumnya.

Untuk produk tardis hipotetis, Anda memerlukan enam kunci yang dilindungi kata sandi: lima untuk menggantikan lima dalam build/target/product/security , dan satu untuk mengganti device/yoyodyne/security/special kunci tambahan device/yoyodyne/security/special diperlukan oleh SpecialApp pada 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 menampilkan yang 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 sandi kepada pengguna untuk semua kunci yang dilindungi sandi, skrip akan menandatangani ulang semua file APK di input target .zip dengan kunci rilis. Sebelum menjalankan perintah, Anda juga dapat menyetel variabel lingkungan ANDROID_PW_FILE ke nama file sementara; skrip kemudian memanggil editor Anda untuk memungkinkan 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 yang lebih rendah. Sebagaimana 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 untuk rilis, dua kunci penandatanganan untuk file APEX diganti dengan kunci rilis. Kunci payload sistem file ditentukan dengan tanda --extra_apex_payload dan seluruh kunci penandatanganan file APEX ditentukan dengan tanda --extra_apks .

Untuk produk tardis, asumsikan bahwa Anda memiliki konfigurasi kunci berikut untuk file APEX 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 menggantikan 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 payload gambar file). com.android.tzdata.apex diperlakukan sebagai tanda tangan sebelumnya. 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

sign_target_files_apks penandatanganan sign_target_files_apks menulis ulang deskripsi dan sidik jari build dalam file properti build untuk menunjukkan bahwa build tersebut adalah build yang ditandatangani. Bendera --tag_changes mengontrol pengeditan 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 sertifikat / kunci pribadi menggunakan alat openssl dari openssl.org :

# generate RSA key
openssl 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 key
openssl 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 key
openssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt

# securely delete the temp.pem file
shred --remove temp.pem

Perintah openssl pkcs8 yang diberikan di atas membuat file .pk8 tanpa kata sandi, cocok untuk digunakan dengan sistem build. Untuk membuat .pk8 diamankan dengan password (yang harus Anda lakukan untuk semua kunci rilis yang sebenarnya), menggantikan -nocrypt argumen dengan -passout stdin ; kemudian openssl akan mengenkripsi kunci privat dengan kata sandi yang dibaca dari input standar. Tidak ada prompt yang dicetak, jadi jika stdin adalah terminal, program akan tampak hang ketika sebenarnya hanya menunggu Anda untuk memasukkan kata sandi. Nilai lain bisa 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 hati-hati saat membuat kunci rilis. Secara khusus, utilitas GNUshred mungkin tidak efektif pada jaringan atau sistem file terjurnal. 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 memasukkannya ke perangkat. Untuk membuat gambar yang ditandatangani dari file target, jalankan perintah berikut dari root pohon Android:

img_from_target_files signed-target-files.zip signed-img.zip
File yang dihasilkan, signed-img.zip , berisi semua file signed-img.zip . Untuk memuat gambar ke perangkat, gunakan fastboot sebagai berikut:
fastboot update signed-img.zip