Derlemeleri yayınlamak için imzalayın

Android OS görüntüleri iki yerde kriptografik imzalar kullanır:

  1. Resmin 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, 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ında test-anahtarları altında build/target/product/security. Android OS görüntüsü oluşturma make kullanıldığında .apk dosyanın tamamı test anahtarları. 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, sözleşme imzalarken özel bir setle herkese açık olarak yayınlanmış veya dağıtılan Android OS görüntüsü yayın-anahtarları arasında geçiş yapın.

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. Herhangi bir dizini kullanabilirsiniz, ancak yedeklenmiş ve güvenli bir konum olabilir. 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 imzala

İmzalanmış hedef dosyalar zip dosyası, imzalı bir OTA güncelleme ZIP dosyasına dönüştürülebilir şu prosedürü kullanarak:
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 Asistan'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ı ortak anahtarlarla karşılaştırarak kontrol eder ana sistemde, /system/etc/security/otacerts.zip dosyasında depolanır (varsayılan olarak). Kurtarma işlemi, imzayı depolanan ortak anahtarlarla karşılaştırarak kontrol eder kurtarma bölümü RAM diskinde, /res/keys dosyasında.

Varsayılan olarak, derleme tarafından oluşturulan hedef dosyalar .zip Test anahtarıyla eşleşecek OTA sertifikası. Yayınlanan bir resimde farklı bir Cihazların, orijinal e-posta adresinin güncelleme paketi. -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 kümesine bir anahtar eklediğinizde yalnızca başka cihazdan yükleme yoluyla yüklenebilen paketleri imzalamak mümkündür (ana sistemin güncelleme indirme mekanizmasının düzgün çalıştığını varsayarak otacerts.zip için doğrulama yapılmasını gerektirir. Ekstra anahtarlar için PRODUCT_Extra_RECOVERY_KEYS ayarı ayarlanarak yalnızca kurtarmaya dahil edilir. değişkenini nasıl kullanacağınızı göstereceğim:

vendor/yoyodyne/tardis/products/tardis.mk
 [...]

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

Ortak anahtar da buna dahildir Kurtarma sürecinde vendor/yoyodyne/security/tardis/sideload.x509.pem anahtar dosyası kullanarak imzalanmış paketleri yükleyebilmesi gerçekleşebilir. Ancak ekstra anahtar otacerts.zip içine dahil edilmez. indirilen paketleri doğru şekilde doğrulayan sistemlerin kurtarma işlemini paket sayısı bu anahtarla imzalanır.

Sertifikalar ve özel anahtarlar

Her anahtar iki dosyayla gelir: Sertifikayı içeren sertifika .x509.pem uzantısı ve .pk8 uzantısına sahip özel anahtar içerir. Özel anahtar gizli tutulmalıdır ve paket imzalamak için gereklidir. Temel şifre ile korunuyor olabilir. Bu sertifika Kontrast, anahtarın yalnızca ortak yarısını içerir, böylece dağıtılabilir yaygın olarak kullanılan bir terimdir. Paketin ilgili alan tarafından imzalandığını doğrulamak için kullanılır gizli anahtardı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 anahtardır.
platform
Temel platformun parçası olan paketlerin test anahtarı.
paylaşıldı
Ev/kişiler sürecinde paylaşılan öğelerin anahtarını test edin.
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 emin olmak için 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

Derleme artık SpecialApp.apk'yi 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. Sertifikalar ve gizliliğe ilişkin tüm bilgiler anahtarlar, hedef dosyalara dahil edilir. Bu imzalamak için komut dosyası, imzalama anahtarları anahtara göre değiştirilebilir adı veya APK adı.

--key_mapping ve --default_key_mappings kullanın işaretlerine göre anahtar değişimini belirtmek için kullanılır:

  • --key_mapping src_key=dest_key işareti tek seferde bir anahtarın değiştirileceğini belirtir.
  • --default_key_mappings dir işareti değiştirmek için beş anahtarlı bir dizindir. build/target/product/security; eşdeğerdir. Eşlemeleri belirtmek için beş kez --key_mapping.
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

Şunu kullanın: --extra_apks apk_name1,apk_name2,...=key işareti kullanabilirsiniz. Eğer key boş bırakıldı, komut dosyası belirtilen APK'ları işler oturum açın.

Varsayımsal tardis ürünü için altı şifre korumalı anahtara ihtiyacınız vardır: build/target/product/security içindeki beşin yerine beş ve bir (device/yoyodyne/security/special ek anahtarını değiştirin) yukarıdaki örnekte SpecialApp. 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şimi

Android 10 Yükleme için APEX dosya biçimi alt seviye sistem modüllerinden Şurada açıklandığı gibi: APEX imzası kullanıyorsanız her bir APEX dosyası biri APEX'teki mini dosya sistemi resmi, diğeri ise diğeri ise APEX'in tamamı için geçerlidir.

Sürüm için imza atarken bir APEX dosyasına ait iki imzalama anahtarı değiştirilir içeren bir e-posta alırsınız. 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 bırakma tuşları (APEX dosyası için runtime_apex_container ve runtime_apex_payload) kaldırın. 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 iziyle birlikte, bu yapılandırmanın derleme imzalı bir derlemedir. --tag_changes işareti hangi düzenlemeleri kontrol eder? bu işlemler dijital parmak izine uygulanır. Görmek için komut dosyasını -h ile çalıştırın her tür belgeye dahil edilir.

Anahtarları manuel olarak oluşturma

Android, ortak üs 3 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 opensl pkcs8 komutu, no değerine sahip bir .pk8 dosyası oluşturur. ve derleme sistemiyle kullanılmaya uygun bir şifre oluşturmalıdır. Güvenliği .pk8 olan bir dosya oluşturmak için bir şifreyle (tüm gerçek sürüm anahtarları için yapmanız gerekir) -passout stdin ile -nocrypt bağımsız değişken; ardından Opensl özel anahtarı standart girişten okunan bir şifreyle şifreler. Sıra No: istemi yazdırılır. Böylece, stdin terminaliyse programın asılı kaldığında yalnızca şifre girmenizi beklerken işe yarar. Diğer değerler parolayı başka konumlardan okumak üzere-passout bağımsız değişkeni için kullanılır; şunun için: daha fazla bilgi için Openssl dokümanlarını inceleyin.

temp.pem ara dosyası, herhangi bir türde olmadan özel anahtarı Şifre korumasından dolayı, sürüm oluştururken bu bilgileri dikkatli bir şekilde atın tuşlarını kullanın. Özellikle, GNUshred yardımcı programı ağda etkili olmayabilir veya günlüğe kaydedilen dosya sistemleri için geçerlidir. RAM diskinde bulunan bir çalışma dizinini kullanabilirsiniz (tmpfs bölümü gibi) gibi, anahtarların oluşturulması sırasında istemeden ifşa edilmemektedir.

Resim dosyaları oluşturma

signed-target_files.zip aboneliğiniz olduğunda şunları yapmanız gerekir: bir cihaza yerleştirebilmek için resmi oluşturun. Hedef dosyalardan imzalı resim oluşturmak için Android kök dizininden aşağıdaki komutu ağaç:

img_from_target_files signed-target_files.zip signed-img.zip
. Elde edilen 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
.