Sürüm için yapıları imzalayın

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

  1. 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.
  2. 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ı.
ağ yığını
Ağ sisteminin parçası olan paketler için test anahtarı. Networkstack anahtarı, Modüler Sistem Bileşenleri olarak tasarlanan ikili dosyaları imzalamak için kullanılır. Modül güncellemeleriniz ayrı olarak oluşturulmuşsa ve cihaz görüntünüze ö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 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 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ı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.zip
Sonuç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