Derlemeleri yayınlamak için imzalayın

Android OS resimleri, kriptografik imzaları iki yerde kullanır:

  1. 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.
  2. 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ı.
ağ yığını
Ağ iletişimi sisteminin parçası olan paketler için test anahtarı. İlgili içeriği oluşturmak için kullanılan networkstack anahtarı, Modüler Sistem Bileşenleri ziyaret edin. Modül güncellemeleriniz ayrı olarak oluşturulduysa ve önceden oluşturulmuş olarak entegre edilmişse içinde bir ağ yığını anahtarı oluşturmanız gerekmeyebilir. Android kaynak ağacı.

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 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 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
Oluşturulan 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