Sürüm için Yapıları İmzalama

Android işletim sistemi görüntüleri, iki yerde kriptografik imzalar kullanır:

  1. Her .apk görüntünün içinde dosya imzalanmalıdır. Android'in Paket Yöneticisi bir kullanır .apk iki şekilde imza:
    • Bir uygulama değiştirildiğinde, eski uygulamanın verilerine erişmek için eski uygulama ile aynı anahtarla imzalanmalıdır. Bu üzerine yazarak kullanıcı Uygulamaları güncelleme için hem de geçerlidir .apk ve altında yüklü daha yeni bir sürümü ile bir sistem uygulamasına geçersiz kılmaya yönelik /data .
    • İki veya daha fazla uygulama bir kullanıcı kimliğini paylaşmak istiyorsa (böylece veri paylaşabilmeleri vb.), aynı anahtarla imzalanmalıdır.
  2. 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ğaç altında test tuşları içerir build/target/product/security . Kullanan bir Android OS imajı Bina make tüm imzalayacak .apk test tuşlarını kullanarak dosyaları. Test anahtarları herkes tarafından bilindiğinden, herkes kendi .apk dosyalarını aynı anahtarlarla imzalayabilir; bu da, işletim sistemi görüntünüzde yerleşik olarak bulunan sistem uygulamalarını değiştirmelerine veya ele geçirmelerine izin verebilir. Nedenle sadece erişebilir bırakma-tuşlarının özel set ile herhangi açıklanmayacağı veya dağıtılan Android işletim sistemi görüntüsünü imzalamak için kritik öneme sahiptir.

Kendi benzersiz yayın 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 hedef-dosyalar alır .zip girdi olarak ve yeni bir hedef dosyalar üretir .zip ettiği tüm .apk dosyaları yeni anahtarlarla imzalanan edilmiştir. Yeni imzalanan görüntüler altında bulunabilir IMAGES/ içinde signed-target_files.zip .

OTA paketlerini imzalama

A imzalı hedef dosyaları aşağıdaki prosedürü kullanarak imzalı OTA güncellemesi zip dönüştürülebilir zip
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.

Kullanarak, bir kere ana sistem tarafından: Ana sistemden alınan Güncelleştirme paketleri genellikle iki kez doğrulanmaktadır RecoverySystem.verifyPackage() kurtarma ile tekrar android API yöntemi, vb. RecoverySystem API kontrolleri dosya ana sistemde kayıtlı umumi anahtarlardan karşı imza, /system/etc/security/otacerts.zip (varsayılan olarak). Kurtarma çekleri dosya kurtarma bölümü RAM diskinde saklanan kamu anahtarları, karşı imza /res/keys .

Varsayılan olarak, hedef-dosyalar .zip inşa setleri test anahtarını maç için OTA sertifika üretti. Yayınlanan bir görüntüde, cihazların güncelleme paketinin orijinalliğini doğrulayabilmesi için farklı bir sertifika kullanılmalıdır. Geçme -o bayrağı sign_target_files_apks , önceki bölümde gösterildiği gibi, sizin certs dizinden bırakma anahtarı sertifika ile test anahtarı sertifikası yerine geçer.

Normalde sistem görüntüsü ve kurtarma görüntüsü, aynı OTA ortak anahtar setini depolar. Tuşların sadece kurtarma seti için bir tuşa ekleyerek, o (ana sistemin güncelleme indir mekanizması doğru otacerts.zip karşı doğrulamayı yapıyor varsayarak) yalnızca sideloading yoluyla kurulabilir paketler imzalamak mümkündür. Ü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.mk
 [...]

PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload

Bu genel anahtar içerir vendor/yoyodyne/security/tardis/sideload.x509.pem onunla imzalanan paketleri yükleme böylece kurtarma tuşları dosyasında. Doğru indirilmemiş paketleri doğrulama sistemleri bu anahtarla imzalanmış paketleri kurtarma çağırmak yok bu yüzden yedek anahtar, otacerts.zip olsa dahil değildir.

Sertifikalar ve özel anahtarlar

Uzatma .x509.pem sahip sertifika, ve uzatma .pk8 sahip özel anahtar,: Her anahtar iki dosyalarında geliyor. Ö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 inşa ikamet hepsi beş anahtarı kullanır build/target/product/security :

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ı.
ağ yığını
Ağ sisteminin parçası olan paketler için test anahtarı. Networkstack anahtar olarak dizayn ikilileri imzalamak için kullanılır Modüler Sistem Bileşenlerinin . Modül güncellemeleriniz ayrı olarak oluşturulmuşsa ve cihaz görüntünüzde önceden oluşturulmuş olarak entegre edilmişse, Android kaynak ağacında bir ağ yığını anahtarı oluşturmanız gerekmeyebilir.

Bireysel paketler, Android.mk dosyalarında LOCAL_CERTIFICATE ayarını yaparak bu anahtarlardan birini belirtir. (bu değişken ayarlanmadıysa testkey kullanılır.) Yol adına göre tamamen farklı bir anahtar da belirtebilirsiniz, örneğin:

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

LOCAL_CERTIFICATE := device/yoyodyne/security/special

Şimdi inşa kullanan device/yoyodyne/security/special.{x509.pem,pk8} SpecialApp.apk imzalamak için anahtar. İnşa şifre korumalı değildir sadece özel tuşlarını kullanabilirsiniz.

Gelişmiş imzalama seçenekleri

APK imzalama anahtarı değiştirme

İmza komut sign_target_files_apks bir yapı için oluşturulan hedef dosyalarda ç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.

Kullanın --key_mapping ve --default_key_mappings anahtar adlarına göre anahtar değiştirme belirtmek için bayrakları:

  • --key_mapping src_key = dest_key bayrak seferinde bir anahtar için değiştirilmesini belirtir.
  • --default_key_mappings dir bayrağı tüm anahtarları yerine beş tuşlarıyla bir dizin belirtir build/target/product/security ; o kullanmaya eşdeğer olduğunu --key_mapping eşleştirmeleri belirtmek için beş kez.
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

Kullanım --extra_apks apk_name1,apk_name2,... = key APK adlarına göre imzalama anahtarı değiştirmeler belirtmek için bayrak. Eğer key boş bırakılırsa, script davranır önceden imzalanmış olarak belirtilen APK'ler.

Varsayımsal tardis ürün için, altı parola korumalı anahtarları gerekir: beş beş yerine build/target/product/security ek anahtar yerine, ve bir device/yoyodyne/security/special yukarıdaki örnekte SpecialApp gerektirdiği. 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.

Hepsi şifre korumalı anahtarlar, giriş hedef tüm APK dosyaları komut yeniden işaretler için şifreler için kullanıcının uyarılmasından sonra .zip bırakma tuşlarıyla. Komutunu çalıştırmadan önce, aşağıdakileri ayarlayabilirsiniz ANDROID_PW_FILE geçici dosya adına ortam değişkeni; 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 tanıttı APEX dosya biçimini alt düzey sistem modülleri yüklemek için. Açıklandığı gibi APEX imzalanması bir APEX içinde küçük dosya sistemi görüntü için bir ve bütün APEX için diğer: Her APEX dosyası iki tuşlarıyla imzalanır.

Yayın için imzalarken, bir APEX dosyası için iki imzalama anahtarı, yayın anahtarları ile değiştirilir. Dosya sistemi yük anahtarı ile belirtilir --extra_apex_payload bayrağı ve tüm APEX dosya imzalama anahtarı ile belirtilir --extra_apks bayrak.

Tardis ürün için, sizin için aşağıdaki anahtar yapılandırmaya sahip olduğunu varsayalım com.android.conscrypt.apex , com.android.media.apex ve com.android.runtime.release.apex APEX dosyaları.

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 imza anahtarlarını geçersiz kılan com.android.runtime.release.apex ve com.android.tzdata.apex bırakma imzalanması sırasında. Özellikle, com.android.runtime.release.apex belirtilen çıktıktan (imzalanır runtime_apex_container APEX dosya ve runtime_apex_payload dosyası resim yük için). com.android.tzdata.apex ön imzalı olarak ele alınır. 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 komut yeniden yazar inşa özellikleri dosyalarında inşa açıklaması ve parmak izi imzalanması inşa imzalı yapı olduğunu yansıtmak için. --tag_changes parmak izi yapılan hangi düzenlemeler bayrak kontrollerini. İle komut dosyasını çalıştırın -h tüm bayrakların üzerinde belgelere bakın.

Anahtarları manuel olarak oluşturma

Sen den openssl aracını kullanarak sertifikası / özel anahtar çiftleri oluşturabilir kamu üs 3. sahip Android kullanır 2048 bit RSA anahtarları 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

Yukarıda verilen openssl pkcs8 komut inşa sistemi ile kullanıma uygun hiçbir şifre ile .pk8 dosya oluşturur. (Tüm fiili bırakma anahtarları için yapmalısınız) bir şifre ile güvenli bir .pk8 oluşturmak için değiştirmek -nocrypt ile argüman -passout stdin ; 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 bkz openssl belgelerine .

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ı bir kez oluşturduktan sonra, bir cihaza yerleştirebilmek için görüntüyü oluşturmanız gerekir. Hedef dosyalardan imzalı 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.zip
sonuç dosyası, signed-img.zip , tüm .img dosyalarını içerir. Bir aygıt üzerinde bir görüntü yüklemek için kullanımı hızlı önyükleme olarak aşağıdaki gibidir:
fastboot update signed-img.zip