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

Android işletim sistemi 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, bir .apk imzasını iki şekilde kullanır:
    • Bir uygulama değiştirildiğinde, eski uygulamanın verilerine erişmek için eski uygulama ile aynı anahtarla imzalanmalıdır. Bu, hem .apk üzerine yazarak kullanıcı uygulamalarını güncellemek için hem de /data altına daha yeni bir sürüm yüklenmiş bir sistem uygulamasını 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ş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ğacı, build/target/product/security altındaki 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ği için, herkes kendi .apk dosyalarını aynı anahtarlarla imzalayabilir; bu, işletim sistemi görüntünüzde yerleşik sistem uygulamalarını değiştirmelerine veya ele geçirmelerine izin verebilir. Bu nedenle, genel olarak yayınlanmış veya dağıtılmış herhangi bir Android OS görüntüsünü, yalnızca sizin erişebileceğiniz özel bir yayın anahtarı seti ile imzalamak çok önemlidir.

Kendi benzersiz serbest bırakma 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 dosyası, girdi olarak bir hedef dosyalar .zip alır ve tüm .apk dosyalarının yeni anahtarlarla imzalandığı yeni bir hedef dosyalar .zip üretir. Yeni imzalanmış resimler IMAGES/ altında signed-target_files.zip içinde bulunabilir.

OTA paketlerini imzalama

İmzalı bir hedef dosyalar 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

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.

Ana sistemden alınan güncelleme paketleri genellikle iki kez doğrulanır: bir kez ana sistem tarafından, android API'sindeki RecoverySystem.verifyPackage() yöntemi kullanılarak ve ardından tekrar kurtarma ile. RecoverySystem API, imzayı ana sistemde, /system/etc/security/otacerts.zip dosyasında (varsayılan olarak) depolanan ortak anahtarlara karşı kontrol eder. Kurtarma, /res/keys dosyasındaki kurtarma bölümü RAM diskinde saklanan ortak anahtarlara karşı imzayı kontrol eder.

Varsayılan olarak, derleme tarafından üretilen 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 gerçekliğini doğrulayabilmesi için farklı bir sertifika kullanılmalıdır. Önceki bölümde gösterildiği gibi -o bayrağını sign_target_files_apks , test anahtarı sertifikasını sertifikalar dizininizdeki yayın anahtarı sertifikasıyla değiştirir.

Normalde sistem görüntüsü ve kurtarma görüntüsü, aynı OTA ortak anahtar setini depolar. Yalnızca kurtarma anahtarlarına bir anahtar ekleyerek, yalnızca yandan yükleme yoluyla kurulabilen paketleri imzalamak mümkündür (ana sistemin güncelleme indirme mekanizmasının otacerts.zip'e karşı doğrulamayı doğru yaptığı varsayılarak). Ü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
tutucu4 l10n-yer
 [...]

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

Bu, kurtarma anahtarları dosyasındaki ortak anahtar vendor/yoyodyne/security/tardis/sideload.x509.pem içerir, böylece onunla imzalanmış paketleri kurabilir. Fazladan anahtar otacerts.zip dosyasına dahil değildir , bu nedenle indirilen paketleri doğru bir şekilde doğrulayan sistemler bu anahtarla imzalanmış paketler için kurtarma 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ı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 derlemesi, tümü build/target/product/security içinde bulunan beş anahtar kullanır:

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ı, Modüler Sistem Bileşenleri olarak tasarlanmış ikili dosyaları imzalamak için kullanılır. 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 test anahtarı kullanılır.) Yol adına göre tamamen farklı bir anahtar da belirtebilirsiniz, örneğin:

device/yoyodyne/apps/SpecialApp/Android.mk
tutucu6 l10n-yer
 [...]

LOCAL_CERTIFICATE := device/yoyodyne/security/special

Artık yapı, 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ı değiştirme

sign_target_files_apks imzalama komut dosyası, bir yapı için oluşturulan hedef dosyalar üzerinde ç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.

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

  • --key_mapping src_key = dest_key bayrağı, her seferinde bir anahtarın değiştirilmesini belirtir.
  • --default_key_mappings dir bayrağı, build/target/product/security içindeki tüm anahtarları değiştirmek için beş anahtarlı bir dizini belirtir; eşlemeleri belirtmek için --key_mapping 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 işaretini kullanın. key boş bırakılırsa, komut dosyası belirtilen APK'ları önceden imzalanmış olarak kabul eder.

Varsayımsal tardis ürünü için altı parola korumalı anahtara ihtiyacınız vardır: beşi build/target/product/security içindeki beşi değiştirmek için ve biri yukarıdaki örnekte SpecialApp tarafından gerekli olan ek anahtar device/yoyodyne/security/special değiştirmek için. 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.

Kullanıcıdan tüm parola korumalı anahtarların parolalarını istedikten sonra komut dosyası, hedef .zip girişindeki tüm APK dosyalarını sürüm 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 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, alt düzey sistem modüllerini yüklemek için APEX dosya biçimini sunar . APEX imzalamada açıklandığı gibi, her APEX dosyası iki anahtarla imzalanır: biri bir APEX içindeki mini dosya sistemi görüntüsü için ve diğeri tüm APEX için.

Yayın için imzalarken, bir APEX dosyası için iki imzalama anahtarı, yayın anahtarları ile değiştirilir. Dosya sistemi veri yükü anahtarı --extra_apex_payload bayrağıyla belirtilir ve tüm APEX dosya imzalama anahtarı --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 varsayın.

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, 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 (APEX dosyası için runtime_apex_container ve dosya görüntüsü yükü için runtime_apex_payload ) imzalanır. com.android.tzdata.apex önceden imzalanmış olarak kabul edilir. 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 imzalama komut dosyası, derlemenin imzalı bir derleme olduğunu yansıtmak için derleme özellikleri dosyalarındaki derleme 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 komut dosyasını -h ile çalıştırın.

Anahtarları manuel olarak oluşturma

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, yapı sistemiyle kullanıma uygun, parolasız bir .pk8 dosyası oluşturur. Parolayla korunan bir .pk8 oluşturmak için (bunu 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; 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 openssl belgelerine bakın.

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ı oluşturduktan sonra, bir cihaza yerleştirebilmek için görüntüyü oluşturmanız gerekir. Hedef dosyalardan imzalanmış 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
Ortaya çıkan dosya, signed-img.zip , tüm .img dosyalarını içerir. Bir cihaza görüntü yüklemek için fastboot'u şu şekilde kullanın:
fastboot update signed-img.zip