Android OS resimleri, kriptografik imzaları iki yerde kullanır:
- Resimdeki her
.apk
dosyası imzalanmış olmalıdır. Android Paket Yöneticisi,.apk
imzasını iki şekilde kullanır:- Bir uygulama değiştirildiğinde, uygulamanın
ve eski uygulamanın verilerine erişmek için aşağıdaki adımları uygulayın. Bu tutar
.apk
öğesinin üzerine yazarak kullanıcı uygulamalarını güncellemek ve altında daha yeni bir sürüm yüklü bir sistem uygulamasını geçersiz kılma/data
. - İki veya daha fazla uygulama bir kullanıcı kimliğini paylaşmak isterse (böylece verileri vb.) kullanıyorsanız aynı anahtarla imzalanmalıdır.
- Bir uygulama değiştirildiğinde, uygulamanın
ve eski uygulamanın verilerine erişmek için aşağıdaki adımları uygulayın. Bu tutar
- OTA güncelleme paketleri, yükleme işlemi bunları reddeder.
Tuşları bırakın
Android ağacı, build/target/product/security
altında test-keys içerir. make
kullanarak bir Android OS resmi oluşturmak, tüm .apk
dosyalarını test anahtarları ile imzalar. Test anahtarları herkes tarafından bilindiği için, herkes kendi imzasını imzalayabilir
Aynı anahtarlara sahip .apk dosyaları. Bu durum, bunların sistemi değiştirmesine veya ele geçirmesine neden olabilir.
yerleşik olarak bulunan
uygulamalardan bahsedeceğiz. Bu nedenle, herkese açık olarak yayınlanan veya dağıtılan tüm Android OS imajlarının yalnızca size ait özel bir sürüm anahtarı grubuyla imzalanması önemlidir.
Kendi benzersiz sürüm anahtarı grubunuzu oluşturmak için aşağıdaki komutları kökü:
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
, kuruluşunuzun kimliğini yansıtacak şekilde değiştirilmelidir
ekleyebilirsiniz. İstediğiniz dizini kullanabilirsiniz ancak yedeklenen ve güvenli bir konum seçmeye dikkat edin. Bazı tedarikçiler
güçlü bir parola ile girmesini ve şifrelenmiş anahtarı depolamasını
kaynak kontrolünde; diğerleri sürüm anahtarlarını tamamen başka bir yerde
saklayabilir,
bu tür ortamlarda yürütülebilir.
Yayın görüntüsü oluşturmak için şunları kullanın:
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
sign_target_files_apks
komut dosyası bir hedef dosya alır
.zip
girdisini verir ve şurada yeni bir hedef dosya oluşturur: .zip
Yeni anahtarlarla imzalanan tüm .apk
dosyaları. Yeni
imzalı resimler IMAGES/
alan adının altında bulunabilir.
signed-target_files.zip
.
OTA paketlerini imzalama
İmzalı hedef dosya ZIP'i, aşağıdaki prosedür kullanılarak imzalı bir OTA güncelleme ZIP'ine dönüştürülebilir:
ota_from_target_files \
-k (--package_key)
signed-target_files.zip \
signed-ota_update.zip
İmzalar ve başka cihazdan yükleme
Başka cihazdan yükleme, kurtarmanın normal paket imzasını atlamaz doğrulama mekanizmasıdır; bir paket yüklemeden önce, kurtarma işlemi Google Chrome'da saklanan genel anahtarlarla eşleşen özel anahtarlardan biriyle imzalanır. kablosuz olarak teslim edilen bir paket için olduğu gibi, kurtarma bölümünü de geride bırakın.
Ana sistemden alınan güncelleme paketleri genellikle iki kez doğrulanır:
bir kez ana sistem tarafından
RecoverySystem.verifyPackage()
.
yöntemini kullandığınızdan emin olun, ardından
ele alacağız. RecoverySystem API, imzayı ana sistemde (varsayılan olarak) /system/etc/security/otacerts.zip
dosyasında depolanan ortak anahtarlarla karşılaştırır. Kurtarma işlemi, imzayı kurtarma bölümü RAM diskinde /res/keys
dosyasında depolanan ortak anahtarlarla karşılaştırır.
Varsayılan olarak, derleme tarafından oluşturulan hedef dosyalar .zip
Test anahtarıyla eşleşecek OTA sertifikası. Cihazların güncelleme paketinin özgünlüğünü doğrulayabilmesi için yayınlanan resimde farklı bir sertifika kullanılmalıdır. -o
işareti şu kullanıcıya iletiliyor:
Önceki bölümde gösterildiği gibi sign_target_files_apks
,
sertifikalarınızdaki sürüm anahtarı sertifikasını içeren test anahtarı sertifikası
dizin.
Normalde sistem görüntüsü ve kurtarma görüntüsü aynı OTA kümesini depolar genel anahtarlar. Yalnızca kurtarma anahtar grubuna bir anahtar ekleyerek yalnızca harici yükleme yoluyla yüklenebilen paketleri imzalamak mümkündür (ana sistemin güncelleme indirme mekanizmasının otacerts.zip ile doğru şekilde doğrulama yaptığı varsayılır). Ürün tanımınıza PRODUCT_EXTRA_RECOVERY_KEYS değişkenini ekleyerek yalnızca kurtarma işlemine dahil edilecek ek anahtarları belirtebilirsiniz:
vendor/yoyodyne/tardis/products/tardis.mk
[...] PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload
Bu, kurtarma anahtarları dosyasında bulunan ortak anahtarı vendor/yoyodyne/security/tardis/sideload.x509.pem
içerir. Böylece, bu anahtarla imzalanan paketler yüklenebilir. Ancak ekstra anahtar otacerts.zip içine dahil edilmez.
İndirilen paketleri doğru şekilde doğrulayan sistemlerin kurtarma işlemini
paket sayısı bu anahtarla imzalanır.
Sertifikalar ve özel anahtarlar
Her anahtar iki dosyada gelir: .x509.pem uzantılı sertifika ve .pk8 uzantılı özel anahtar. Özel anahtar gizli tutulmalıdır ve paket imzalamak için gereklidir. Anahtarın kendisi şifreyle korunuyor olabilir. Sertifika ise anahtarın yalnızca herkese açık yarısını içerir. Bu nedenle, yaygın olarak dağıtılabilir. Bir paketin ilgili özel anahtarla imzalanıp imzalanmadığını doğrulamak için kullanılır.
Standart Android derlemesi beş anahtar kullanır ve bunların tümü
build/target/product/security
içinde bulunur:
- test anahtarı
- Anahtar belirtmeyen paketler için genel varsayılan anahtar.
- platform
- Temel platformun parçası olan paketler için test anahtarı.
- paylaşıldı
- Ev/kişiler sürecinde paylaşılan öğeler için test anahtarı.
- medya
- Medya/indirme sisteminin parçası olan paketler için test anahtarı.
Bağımsız paketler, LOCAL_CERTIFICATE öğesini ayarlayarak bu anahtarlardan birini belirtir . (bu değişken ayarlanmadıysa test anahtarı kullanılır.) Siz yol adına göre tamamen farklı bir anahtar da belirtebilir, örneğin:
device/yoyodyne/apps/SpecialApp/Android.mk
[...] LOCAL_CERTIFICATE := device/yoyodyne/security/special
Artık derleme, SpecialApp.apk'yı imzalamak için device/yoyodyne/security/special.{x509.pem,pk8}
anahtarını kullanıyor. Derlemede yalnızca
Şifre korumalı değildir .
Gelişmiş imzalama seçenekleri
APK imzalama anahtarı değişimi
İmzalama komut dosyası sign_target_files_apks
hedefte çalışıyor
dosyaları oluşturabilirsiniz. Derleme sırasında kullanılan sertifikalar ve özel anahtarlarla ilgili tüm bilgiler hedef dosyalara dahil edilir. Bu
imzalamak için komut dosyası, imzalama anahtarları anahtara göre değiştirilebilir
adı veya APK adı.
Anahtar adlarına göre anahtar değiştirmeyi belirtmek için --key_mapping
ve --default_key_mappings
işaretlerini kullanın:
--key_mapping src_key=dest_key
işareti tek seferde bir anahtarın değiştirileceğini belirtir.--default_key_mappings dir
işaretçisi,build/target/product/security
içindeki tüm anahtarları değiştirmek için beş anahtar içeren bir dizin belirtir. Bu, eşlemeleri belirtmek için--key_mapping
değerini beş kez kullanmaya eşdeğerdir.
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
İmzalama anahtarı değişimlerini APK adlarına göre belirtmek için --extra_apks apk_name1,apk_name2,...=key
işaretini kullanın. Eğer
key
boş bırakıldı, komut dosyası belirtilen APK'ları işler
oturum açın.
Hayali tardis ürünü için altı şifre korumalı anahtara ihtiyacınız vardır: build/target/product/security
'teki beş anahtarı değiştirmek için beş ve yukarıdaki örnekte SpecialApp tarafından istenen ek device/yoyodyne/security/special
anahtarını değiştirmek için bir anahtar. Anahtarlar aşağıdakilerden biriyse:
dosyalar:
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
Bu durumda tüm uygulamaları şu şekilde imzalarsınız:
./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
Bunun sonucunda aşağıdakiler ortaya çıkar:
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.
Kullanıcıdan tüm şifre korumalı anahtarlara ilişkin şifreleri istedikten sonra,
komut dosyası, .zip
giriş hedefindeki tüm APK dosyalarını
bırakma tuşlarını kullanın. Komutu çalıştırmadan önce,
ANDROID_PW_FILE
ortam değişkenini geçici bir dosya adına dönüştürsün; "the"
komut dosyası, daha sonra düzenleyicinizi çağırarak tüm anahtarlar için şifre girmenize izin verir
(bu, şifreleri girmek için daha kullanışlı bir yol olabilir).
APEX imzalama anahtarı değiştirme
Android 10, alt düzey sistem modüllerini yüklemek için APEX dosya biçimini kullanıma sunar. APEX imzalama bölümünde açıklandığı gibi, her APEX dosyası iki anahtarla imzalanır: biri APEX içindeki mini dosya sistemi resmi için, diğeri ise APEX'in tamamı için.
Yayın için imzalama işlemi yapılırken APEX dosyasındaki iki imzalama anahtarı, yayın anahtarlarıyla değiştirilir. Dosya sistemi yük anahtarı
--extra_apex_payload
işareti ve APEX dosyası imzalama anahtarının tamamı
--extra_apks
işaretiyle belirtilir.
Tardis ürünü için aşağıdaki anahtar yapılandırmasına sahip olduğunuzu varsayın
com.android.conscrypt.apex
için,
com.android.media.apex
ve
com.android.runtime.release.apex
APEX dosyası.
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"
Sürüm anahtarlarını içeren aşağıdaki dosyalarınız da vardır:
vendor/yoyodyne/security/runtime_apex_container.x509.pem vendor/yoyodyne/security/runtime_apex_container.pk8 vendor/yoyodyne/security/runtime_apex_payload.pem
Aşağıdaki komut
com.android.runtime.release.apex
ve
Sürüm imzalama sırasında com.android.tzdata.apex
. Özellikle com.android.runtime.release.apex
, belirtilen sürüm anahtarlarıyla (APEX dosyası için runtime_apex_container
ve dosya resmi yükü için runtime_apex_payload
) imzalanır.
com.android.tzdata.apex
, önceden imzalı olarak kabul edilir. Diğer tüm APEX
dosyaları, hedef dosyalarda listelendiği şekilde varsayılan yapılandırma tarafından işlenir.
./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
Yukarıdaki komut çalıştırıldığında aşağıdaki günlükler gösterilir:
[...] 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) [...]
Diğer seçenekler
sign_target_files_apks
imzalama komut dosyası, derlemeyi yeniden yazar
açıklama ve parmak izini, bu yapılandırmanın
derleme imzalı bir derlemedir. --tag_changes
işareti, parmak izinde hangi düzenlemelerin yapılacağını kontrol eder. Görmek için komut dosyasını -h
ile çalıştırın
her tür belgeye dahil edilir.
Manuel olarak anahtar oluşturma
Android, 3'e ayarlanmış genel üs ile 2048 bit RSA anahtarları kullanır. Hesaplarınız için OpenSl aracını kullanarak sertifika/özel anahtar çiftlerini openssl.org adresini ziyaret edin:
# 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
Yukarıda verilen openssl pkcs8 komutu, derleme sistemiyle kullanılmaya uygun, şifre içermeyen bir .pk8 dosyası oluşturur. Şifreyle korunan bir .pk8 dosyası oluşturmak için (tüm gerçek sürüm anahtarları için yapmanız gerekir) -nocrypt
bağımsız değişkenini -passout stdin
ile değiştirin. Ardından openssl, özel anahtarı standart girişten okunan bir şifreyle şifreler. Sıra No:
komut istemi yazdırılır. Böylece, stdin terminaliyse programın asılı görünmesi
yalnızca şifre girmenizi beklerken işe yarar. Şifrenin diğer konumlardan okunması için the-passout bağımsız değişkeni için başka değerler kullanılabilir. Ayrıntılar için
openssl belgelerine bakın.
temp.pem ara dosyası, özel anahtarı herhangi bir şifre koruması olmadan içerir. Bu nedenle, sürüm anahtarları oluştururken bu dosyayı dikkatli bir şekilde silin. Özellikle GNUshred yardımcı programı, ağ veya günlük kaydı tutulan dosya sistemlerinde etkili olmayabilir. Ara ürünlerin yanlışlıkla açığa çıkmamasını sağlamak için anahtar oluştururken RAM diskinde bulunan bir çalışma dizini (ör. tmpfs bölümü) kullanabilirsiniz.
Resim dosyası oluşturma
signed-target_files.zip
'e sahip olduğunuzda, cihaza yerleştirebilmeniz için resmi oluşturmanız gerekir.
Hedef dosyalardan imzalı görüntü oluşturmak için Android ağacının kökünden aşağıdaki komutu çalıştırın:
img_from_target_files signed-target_files.zip signed-img.zip
signed-img.zip
dosyası, tüm .img
dosyalarını içerir.
Bir cihaza görüntü yüklemek için fastboot komutunu şu şekilde kullanın:
şöyle olur:
fastboot update signed-img.zip