Android OS görüntüleri iki yerde kriptografik imzalar kullanır:
- 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.
- 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
- 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ı.
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 keyopenssl 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 keyopenssl 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 keyopenssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt
# securely delete the temp.pem fileshred --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.