Android işletim sistemi görüntüleri, iki yerde kriptografik imzalar kullanır:
- Resmin içindeki her
.apk
dosyası imzalanmalıdır. Android'in Paket Yöneticisi, bir.apk
imzasını iki şekilde kullanır:- Bir uygulama değiştirildiğinde, eski uygulamanın verilerine erişmek için eski uygulama ile aynı anahtarla imzalanmalıdır. Bu, hem
.apk
üzerine yazarak kullanıcı uygulamalarını güncellemek için hem de/data
altına daha yeni bir sürüm yüklenmiş bir sistem uygulamasını geçersiz kılmak için geçerlidir. - İki veya daha fazla uygulama bir kullanıcı kimliğini paylaşmak istiyorsa (böylece veri paylaşabilmeleri vb.), aynı anahtarla imzalanmalıdır.
- Bir uygulama değiştirildiğinde, eski uygulamanın verilerine erişmek için eski uygulama ile aynı anahtarla imzalanmalıdır. Bu, hem
- OTA güncelleme paketleri, sistem tarafından beklenen anahtarlardan biri ile imzalanmalıdır, aksi takdirde kurulum işlemi bunları reddedecektir.
Serbest bırakma tuşları
Android ağacı, build/target/product/security
altındaki test anahtarlarını içerir. make
kullanarak bir Android işletim sistemi görüntüsü oluşturmak, test anahtarlarını kullanarak tüm .apk
dosyalarını imzalayacaktır. Test anahtarları herkes tarafından bilindiği için, herkes kendi .apk dosyalarını aynı anahtarlarla imzalayabilir; bu, işletim sistemi görüntünüzde yerleşik sistem uygulamalarını değiştirmelerine veya ele geçirmelerine izin verebilir. Bu nedenle, genel olarak yayınlanmış veya dağıtılmış herhangi bir Android OS görüntüsünü, yalnızca sizin erişebileceğiniz özel bir yayın anahtarı seti ile imzalamak çok önemlidir.
Kendi benzersiz serbest bırakma anahtarları setinizi oluşturmak için Android ağacınızın kökünden şu komutları çalıştırın:
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 bilgilerini yansıtacak şekilde değiştirilmelidir. Herhangi bir dizini kullanabilirsiniz, ancak yedeklenmiş ve güvenli bir konum seçmeye dikkat edin. Bazı satıcılar, özel anahtarlarını güçlü bir parolayla şifrelemeyi ve şifrelenmiş anahtarı kaynak denetiminde saklamayı tercih eder; diğerleri serbest bırakma anahtarlarını tamamen başka bir yerde, örneğin hava boşluklu bir bilgisayarda saklar.
Bir yayın görüntüsü oluşturmak için şunu 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ı, girdi olarak bir hedef dosyalar .zip
alır ve tüm .apk
dosyalarının yeni anahtarlarla imzalandığı yeni bir hedef dosyalar .zip
üretir. Yeni imzalanmış resimler IMAGES/
altında signed-target_files.zip
içinde bulunabilir.
OTA paketlerini imzalama
İmzalı bir hedef dosyalar zip dosyası, aşağıdaki prosedür kullanılarak imzalı bir OTA güncelleme zip dosyasına dönüştürülebilir:
ota_from_target_files \
-k (--package_key)
signed-target_files.zip \
signed-ota_update.zip
İmzalar ve yandan yükleme
Yandan yükleme, kurtarmanın normal paket imzası doğrulama mekanizmasını atlamaz—bir paketi kurmadan önce kurtarma, kurtarma bölümünde depolanan ortak anahtarlarla eşleşen özel anahtarlardan biriyle imzalanmış olduğunu doğrular; -hava.
Ana sistemden alınan güncelleme paketleri genellikle iki kez doğrulanır: bir kez ana sistem tarafından, android API'sindeki RecoverySystem.verifyPackage()
yöntemi kullanılarak ve ardından tekrar kurtarma ile. RecoverySystem API, imzayı ana sistemde, /system/etc/security/otacerts.zip
dosyasında (varsayılan olarak) depolanan ortak anahtarlara karşı kontrol eder. Kurtarma, /res/keys
dosyasındaki kurtarma bölümü RAM diskinde saklanan ortak anahtarlara karşı imzayı kontrol eder.
Varsayılan olarak, derleme tarafından üretilen hedef dosyalar .zip
, OTA sertifikasını test anahtarıyla eşleşecek şekilde ayarlar. Yayınlanan bir görüntüde, cihazların güncelleme paketinin gerçekliğini doğrulayabilmesi için farklı bir sertifika kullanılmalıdır. Önceki bölümde gösterildiği gibi -o
bayrağını sign_target_files_apks
, test anahtarı sertifikasını sertifikalar dizininizdeki yayın anahtarı sertifikasıyla değiştirir.
Normalde sistem görüntüsü ve kurtarma görüntüsü, aynı OTA ortak anahtar setini depolar. Yalnızca kurtarma anahtarlarına bir anahtar ekleyerek, yalnızca yandan yükleme yoluyla kurulabilen paketleri imzalamak mümkündür (ana sistemin güncelleme indirme mekanizmasının otacerts.zip'e karşı doğrulamayı doğru yaptığı varsayılarak). Ürün tanımınızda PRODUCT_EXTRA_RECOVERY_KEYS değişkenini ayarlayarak yalnızca kurtarmaya dahil edilecek ekstra anahtarlar belirleyebilirsiniz:
vendor/yoyodyne/tardis/products/tardis.mktutucu4 l10n-yer
[...] PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload
Bu, kurtarma anahtarları dosyasındaki ortak anahtar vendor/yoyodyne/security/tardis/sideload.x509.pem
içerir, böylece onunla imzalanmış paketleri kurabilir. Fazladan anahtar otacerts.zip dosyasına dahil değildir , bu nedenle indirilen paketleri doğru bir şekilde doğrulayan sistemler bu anahtarla imzalanmış paketler için kurtarma başlatmaz.
Sertifikalar ve özel anahtarlar
Her anahtar iki dosya halinde gelir: .x509.pem uzantılı sertifika ve .pk8 uzantılı özel anahtar . Özel anahtar gizli tutulmalıdır ve bir paketi imzalamak için gereklidir. Anahtarın kendisi bir parola ile korunabilir. Sertifika, aksine, anahtarın yalnızca genel yarısını içerir, bu nedenle geniş çapta dağıtılabilir. Bir paketin ilgili özel anahtar tarafından imzalandığını doğrulamak için kullanılır.
Standart Android derlemesi, tümü build/target/product/security
içinde bulunan beş anahtar kullanır:
- test anahtarı
- Başka türlü bir anahtar belirtmeyen paketler için genel varsayılan anahtar.
- platform
- Çekirdek platformun parçası olan paketler için test anahtarı.
- paylaşılan
- Ev/kişiler sürecinde paylaşılan şeyler için test anahtarı.
- medya
- Medya/indirme sisteminin parçası olan paketler için test anahtarı.
Bireysel paketler, Android.mk dosyalarında LOCAL_CERTIFICATE ayarını yaparak bu anahtarlardan birini belirtir. (bu değişken ayarlanmadıysa test anahtarı kullanılır.) Yol adına göre tamamen farklı bir anahtar da belirtebilirsiniz, örneğin:
device/yoyodyne/apps/SpecialApp/Android.mktutucu6 l10n-yer
[...] LOCAL_CERTIFICATE := device/yoyodyne/security/special
Artık yapı, SpecialApp.apk'yi imzalamak için device/yoyodyne/security/special.{x509.pem,pk8}
anahtarını kullanıyor. Derleme yalnızca parola korumalı olmayan özel anahtarları kullanabilir.
Gelişmiş imzalama seçenekleri
APK imzalama anahtarı değiştirme
sign_target_files_apks
imzalama komut dosyası, bir yapı için oluşturulan hedef dosyalar üzerinde çalışır. Oluşturma sırasında kullanılan sertifikalar ve özel anahtarlarla ilgili tüm bilgiler hedef dosyalara dahil edilir. Yayın için imzalamak için imzalama komut dosyasını çalıştırırken, imzalama anahtarları, anahtar adına veya APK adına göre değiştirilebilir.
Anahtar adlarına göre anahtar değiştirmeyi belirtmek için --key_mapping
ve --default_key_mappings
bayraklarını kullanın:
-
--key_mapping src_key = dest_key
bayrağı, her seferinde bir anahtarın değiştirilmesini belirtir. -
--default_key_mappings dir
bayrağı,build/target/product/security
içindeki tüm anahtarları değiştirmek için beş anahtarlı bir dizini belirtir; eşlemeleri belirtmek için--key_mapping
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
APK adlarına göre imzalama anahtarı değiştirmelerini belirtmek için --extra_apks apk_name1,apk_name2,... = key
işaretini kullanın. key
boş bırakılırsa, komut dosyası belirtilen APK'ları önceden imzalanmış olarak kabul eder.
Varsayımsal tardis ürünü için altı parola korumalı anahtara ihtiyacınız vardır: beşi build/target/product/security
içindeki beşi değiştirmek için ve biri yukarıdaki örnekte SpecialApp tarafından gerekli olan ek anahtar device/yoyodyne/security/special
değiştirmek için. Anahtarlar aşağıdaki dosyalarda olsaydı:
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
Ardından, 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
Bu, aşağıdakileri getirir:
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 parola korumalı anahtarların parolalarını istedikten sonra komut dosyası, hedef .zip
girişindeki tüm APK dosyalarını sürüm anahtarlarıyla yeniden imzalar. Komutu çalıştırmadan önce ANDROID_PW_FILE
ortam değişkenini geçici bir dosya adına da ayarlayabilirsiniz; komut dosyası daha sonra düzenleyicinizi çağırarak tüm anahtarlar için parola girmenize izin verir (bu, parola girmenin daha uygun bir yolu olabilir).
APEX imzalama anahtarının değiştirilmesi
Android 10, alt düzey sistem modüllerini yüklemek için APEX dosya biçimini sunar . APEX imzalamada açıklandığı gibi, her APEX dosyası iki anahtarla imzalanır: biri bir APEX içindeki mini dosya sistemi görüntüsü için ve diğeri tüm APEX için.
Yayın için imzalarken, bir APEX dosyası için iki imzalama anahtarı, yayın anahtarları ile değiştirilir. Dosya sistemi veri yükü anahtarı --extra_apex_payload
bayrağıyla belirtilir ve tüm APEX dosya imzalama anahtarı --extra_apks
bayrağıyla belirtilir.
Tardis ürünü için, com.android.conscrypt.apex
, com.android.media.apex
ve com.android.runtime.release.apex
APEX dosyaları için aşağıdaki anahtar yapılandırmasına sahip olduğunuzu varsayın.
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"
Ve sürüm anahtarlarını içeren aşağıdaki dosyalara sahipsiniz:
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, sürüm imzalama sırasında com.android.runtime.release.apex
ve com.android.tzdata.apex
için imzalama anahtarlarını geçersiz kılar. Özellikle, com.android.runtime.release.apex
belirtilen sürüm anahtarlarıyla (APEX dosyası için runtime_apex_container
ve dosya görüntüsü yükü için runtime_apex_payload
) imzalanır. com.android.tzdata.apex
önceden imzalanmış olarak kabul edilir. Diğer tüm APEX dosyaları, hedef dosyalarda listelendiği gibi 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 komutu çalıştırmak aşağıdaki günlükleri verir:
[...] 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ı, derlemenin imzalı bir derleme olduğunu yansıtmak için derleme özellikleri dosyalarındaki derleme açıklamasını ve parmak izini yeniden yazar. --tag_changes
bayrağı, parmak izinde hangi düzenlemelerin yapıldığını kontrol eder. Tüm bayraklarla ilgili belgeleri görmek için komut dosyasını -h
ile çalıştırın.
Anahtarları manuel olarak oluşturma
Android, genel üs 3 ile 2048 bit RSA anahtarları kullanır. openssl.org adresindeki openssl aracını kullanarak sertifika/özel anahtar çiftleri oluşturabilirsiniz:
# 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, yapı sistemiyle kullanıma uygun, parolasız bir .pk8 dosyası oluşturur. Parolayla korunan bir .pk8 oluşturmak için (bunu 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; sonra openssl özel anahtarı standart girdiden okunan bir parola ile şifreleyecektir. Hiçbir istem yazdırılmaz, bu nedenle stdin terminal ise, program gerçekten sadece bir şifre girmenizi beklerken askıda gibi görünecektir. Diğer konumlardan parolayı okumak için geçiş 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ı, herhangi bir parola koruması olmadan özel anahtarı içerir, bu nedenle serbest bırakma anahtarlarını oluştururken dikkatli bir şekilde atın. Özellikle, GNUshred yardımcı programı ağ veya günlüklü dosya sistemlerinde etkili olmayabilir. Ara ürünlerin yanlışlıkla açığa çıkmamasını sağlamak için anahtar oluştururken bir RAM diskinde (tmpfs bölümü gibi) bulunan bir çalışma dizini kullanabilirsiniz.
Görüntü dosyaları oluşturma
Signed-target-files.zip dosyasını oluşturduktan sonra, bir cihaza yerleştirebilmek için görüntüyü oluşturmanız gerekir. Hedef dosyalardan imzalanmış görüntüyü 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.zipOrtaya çıkan dosya,
signed-img.zip
, tüm .img dosyalarını içerir. Bir cihaza görüntü yüklemek için fastboot'u şu şekilde kullanın:fastboot update signed-img.zip