Android işletim sistemi görüntüleri kriptografik imzaları iki yerde kullanır:
- Görselin içindeki her
.apk
dosyası imzalanmalıdır. Android'in Paket Yöneticisi.apk
imzasını iki şekilde kullanır:- Bir uygulama değiştirildiğinde, eski uygulamanın verilerine erişilebilmesi için eski uygulamayla aynı anahtarla imzalanması gerekir. Bu, hem kullanıcı uygulamalarını
.apk
dosyasının üzerine yazarak güncellemek hem de bir sistem uygulamasını/data
altına yüklenen daha yeni bir sürümle 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şabilirler vb.), aynı anahtarla imzalanmaları gerekir.
- Bir uygulama değiştirildiğinde, eski uygulamanın verilerine erişilebilmesi için eski uygulamayla aynı anahtarla imzalanması gerekir. Bu, hem kullanıcı uygulamalarını
- OTA güncelleme paketlerinin sistem tarafından beklenen anahtarlardan biriyle imzalanması gerekir, aksi takdirde kurulum işlemi bunları reddedecektir.
Anahtarları serbest bırak
Android ağacı build/target/product/security
altında 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ğinden, herkes kendi .apk dosyalarını aynı anahtarlarla imzalayabilir; bu da onların işletim sistemi görüntünüzde yerleşik olan sistem uygulamalarını değiştirmelerine veya ele geçirmelerine olanak tanıyabilir. Bu nedenle, herkese açık olarak yayımlanan veya dağıtılan herhangi bir Android işletim sistemi görüntüsünü yalnızca sizin erişebileceğiniz özel bir sürüm anahtarları kümesiyle imzalamanız kritik öneme sahiptir.
Kendi benzersiz sürüm anahtarlarınızı oluşturmak için şu komutları Android ağacınızın kökünden ç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 kontrolünde saklamayı tercih eder; diğerleri serbest bırakma anahtarlarını hava boşluklu bir bilgisayar gibi tamamen başka bir yerde 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
betiği girdi olarak target-files .zip
dosyasını alır ve tüm .apk
dosyalarının yeni anahtarlarla imzalandığı yeni bir target-files .zip
üretir. Yeni imzalanan görseller, signed-target_files.zip
dosyasındaki IMAGES/
altında bulunabilir.
OTA paketlerini imzalayın
İmzalı bir hedef dosya 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
Dışarıdan yükleme, kurtarmanın normal paket imzası doğrulama mekanizmasını atlamaz; bir paketi kurmadan önce kurtarma, paketin, kurtarma bölümünde depolanan genel anahtarlarla eşleşen özel anahtarlardan biriyle imzalandığını doğrular; tıpkı paket üzerinden teslim edilen bir pakette olduğu gibi. -hava.
Ana sistemden alınan güncelleme paketleri genellikle iki kez doğrulanır: birincisi ana sistem tarafından, android API'sindeki RecoverySystem.verifyPackage()
yöntemi kullanılarak ve ardından tekrar kurtarma yoluyla. RecoverySystem API, imzayı ana sistemde /system/etc/security/otacerts.zip
dosyasında (varsayılan olarak) depolanan genel anahtarlara göre kontrol eder. Kurtarma, imzayı, kurtarma bölümü RAM diskinde /res/keys
dosyasında saklanan ortak anahtarlara göre kontrol eder.
Varsayılan olarak, derlemenin ürettiği 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 orijinalliğini doğrulayabilmesi için farklı bir sertifikanın kullanılması gerekir. Önceki bölümde sign_target_files_apks
gibi -o
bayrağınısign_target_files_apks öğesine iletmek, test anahtarı sertifikasını certs dizininizdeki sürüm anahtarı sertifikasıyla değiştirir.
Normalde sistem görüntüsü ve kurtarma görüntüsü aynı OTA ortak anahtar kümesini saklar. Yalnızca kurtarma anahtar kümesine bir anahtar ekleyerek, yalnızca yandan yükleme yoluyla yüklenebilecek paketleri imzalamak mümkündür (ana sistemin güncelleme indirme mekanizmasının otacerts.zip'e karşı doğru şekilde doğrulama yaptığını varsayarsak). Ürün tanımınızda product_EXTRA_RECOVERY_KEYS değişkenini ayarlayarak ekstra anahtarların yalnızca kurtarma işlemine dahil edilmesini belirtebilirsiniz:
vendor/yoyodyne/tardis/products/tardis.mk
[...] PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload
Buna, kurtarma anahtarları dosyasındaki ortak anahtar vendor/yoyodyne/security/tardis/sideload.x509.pem
dahildir, böylece onunla imzalanmış paketleri yükleyebilir. Ancak ekstra anahtar otacerts.zip dosyasına dahil değildir , dolayısıyla indirilen paketleri doğru şekilde doğrulayan sistemler bu anahtarla imzalanmış paketler için kurtarma işlemini 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ı ve bir paketi imzalamak için gereklidir. Anahtarın kendisi bir parola ile korunuyor olabilir. Sertifika ise anahtarın yalnızca halka açık yarısını içerdiğinden geniş çapta dağıtılabilir. Bir paketin ilgili özel anahtarla imzalandığını doğrulamak için kullanılır.
Standart Android yapısı, tamamı build/target/product/security
dosyasında bulunan beş anahtar kullanır:
- test anahtarı
- Başka şekilde bir anahtar belirtmeyen paketler için genel varsayılan anahtar.
- platformu
- Çekirdek platformun parçası olan paketler için test anahtarı.
- Paylaşıldı
- Ev/kişiler sürecinde paylaşılan şeylere ilişkin test anahtarı.
- medya
- Medya/indirme sisteminin parçası olan paketler için test anahtarı.
Bireysel paketler, Android.mk dosyasında LOCAL_CERTIFICATE ayarını yaparak bu anahtarlardan birini belirtir. (Bu değişken ayarlanmamışsa testkey kullanılır.) Yol adına göre tamamen farklı bir anahtar da belirleyebilirsiniz, örneğin:
device/yoyodyne/apps/SpecialApp/Android.mk
[...] LOCAL_CERTIFICATE := device/yoyodyne/security/special
Artık derleme, 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ının değiştirilmesi
sign_target_files_apks
imzalama komut dosyası, bir yapı için oluşturulan hedef dosyalar üzerinde çalışır. Derleme sırasında kullanılan sertifikalar ve özel anahtarlarla ilgili tüm bilgiler hedef dosyalara dahil edilir. Yayınlanmak üzere 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şimini belirtmek için --key_mapping
ve --default_key_mappings
bayraklarını kullanın:
-
--key_mapping src_key = dest_key
bayrağı, her defasında bir anahtarın değiştirilmesini belirtir. -
--default_key_mappings dir
bayrağıbuild/target/product/security
dosyasındaki tüm anahtarların yerini alacak beş anahtar içeren bir dizini belirtir; eşlemeleri belirtmek için--key_mapping
komutunu 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
bayrağını kullanın. key
boş bırakılırsa komut dosyası, belirtilen APK'ları önceden imzalanmış olarak değerlendirir.
Varsayımsal tardis ürünü için altı adet parola korumalı anahtara ihtiyacınız vardır: build/target/product/security
dosyasındaki beş anahtarın yerine beşi ve yukarıdaki örnekte SpecialApp'in gerektirdiği ek anahtar device/yoyodyne/security/special
yerini almak için bir anahtar. 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
Daha sonra 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 ortaya çıkarır:
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 için parola istemesinin ardından komut dosyası, giriş hedefi .zip
tüm APK dosyalarını serbest bırakma 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 editörünüzü tüm anahtarlar için şifre girmenize izin vermesi için çağırır (bu, şifre 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 imzalama bölümünde açıklandığı gibi, her APEX dosyası iki anahtarla imzalanır: biri APEX içindeki mini dosya sistemi görüntüsü için, diğeri ise APEX'in tamamı için.
Yayınlanmak üzere imzalanırken, bir APEX dosyasının iki imzalama anahtarı, yayın anahtarlarıyla değiştirilir. Dosya sistemi veri yükü anahtarı --extra_apex_payload
bayrağıyla belirtilir ve APEX dosya imzalama anahtarının tamamı --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 varsayalım.
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"
Ayrıca 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 imzalanır (APEX dosyası için runtime_apex_container
ve dosya görüntüsü yükü için runtime_apex_payload
). com.android.tzdata.apex
önceden imzalanmış olarak kabul edilir. Diğer tüm APEX dosyaları, hedef dosyalarda listelenen varsayılan yapılandırmayla 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ı, yapının imzalı bir yapı olduğunu yansıtacak şekilde yapı özellikleri dosyalarındaki yapı 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 betiği -h
ile çalıştırın.
Anahtarları manuel olarak oluştur
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, derleme sistemiyle kullanıma uygun, şifresiz bir .pk8 dosyası oluşturur. Parolayla korunan bir .pk8 oluşturmak için (bunu tüm gerçek sürüm anahtarları için yapmalısınız), -nocrypt
argümanını -passout stdin
ile değiştirin; daha sonra openssl, özel anahtarı standart girişten okunan bir parola ile şifreler. Herhangi bir bilgi istemi yazdırılmaz, dolayısıyla eğer terminal stdin ise, program gerçekten sadece bir şifre girmenizi beklerken askıda kalmış gibi görünecektir. Diğer konumlardan parolayı okumak için 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ı, herhangi bir parola koruması olmayan özel anahtarı içerir; bu nedenle, sürüm anahtarlarını oluştururken bunu dikkatli bir şekilde atın. Özellikle GNUshred yardımcı programı ağ veya günlüklü dosya sistemlerinde etkili olmayabilir. Ara öğelerin yanlışlıkla açığa çıkmamasını sağlamak için anahtarlar oluştururken RAM diskinde bulunan bir çalışma dizinini (tmpfs bölümü gibi) kullanabilirsiniz.
Görüntü dosyaları oluşturun
signed-target_files.zip
dosyasını imzaladığınızda, görüntüyü bir cihaza yerleştirebilmeniz için oluşturmanız gerekir. İmzalı görüntüyü hedef dosyalardan 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.zipSonuçta ortaya çıkan
signed-img.zip
dosyası tüm .img
dosyalarını içerir. Bir cihaza resim yüklemek için fastboot'u şu şekilde kullanın:fastboot update signed-img.zip