APK imza şeması v3

Android 9, APK anahtar rotasyonunu destekler. Bu özellik, uygulamalara APK güncellemesi kapsamında imzalama anahtarlarını değiştirme olanağı sunar. Rotasyonun pratik olması için APK'larda yeni ve eski imzalama anahtarı arasındaki güven düzeyleri belirtilmelidir. Anahtar rotasyonunu desteklemek için yeni ve eski anahtarların kullanılabilmesi amacıyla APK imza şemasını v2'den v3'e güncelledik. V3, desteklenen SDK sürümleri hakkında bilgi ve APK imzalama bloğuna bir döndürme kanıtı yapısı ekler.

APK imzalama bloğu

V1 APK biçimiyle geriye dönük uyumluluğu korumak için v2 ve v3 APK imzaları, ZIP Merkezi Dizini'nden hemen önce bulunan bir APK imzalama bloğunda depolanır.

v3 APK imzalama bloğu biçimi v2 ile aynıdır. APK'nın v3 imzası, 0xf05368c0 kimliğiyle bir kimlik-değer çifti olarak saklanır.

APK imza şeması v3 bloğu

V3 şeması, v2 şemasına çok benzer şekilde tasarlanmıştır. Aynı genel biçime sahiptir ve aynı imza algoritması kimliklerini, anahtar boyutlarını ve EC eğrilerini destekler.

Ancak v3 şeması, desteklenen SDK sürümleri ve rotasyon kanıtı yapısı hakkında bilgi ekler.

Biçim

APK imza şeması v3 bloğu, APK imzalama bloğunun 0xf05368c0 kimliği altında saklanır.

APK imza şeması v3 bloğunun biçimi, v2'nin biçimini takip eder:

  • Uzunluk ön ekiyle başlayan signer'nin uzunluk ön ekiyle başlayan dizisi:
    • uzunluk ön ekiyle signed data:
      • Uzunluk ön ekiyle başlayan digests'nin uzunluk ön ekiyle başlayan dizisi:
        • signature algorithm ID (4 bayt)
        • digest (uzunluk ön eklidir)
      • X.509 certificates uzunluğuna öncelikli sıra:
        • uzunluk ön ekiyle X.509 certificate (ASN.1 DER formu)
      • minSDK (uint32): Platform sürümü bu sayının altındaysa bu imzalayan yoksayılmalıdır.
      • maxSDK (uint32): Platform sürümü bu sayının üzerindeyse bu imzalayan yoksayılmalıdır.
      • Uzunluk ön ekiyle başlayan additional attributes'nin uzunluk ön ekiyle başlayan dizisi:
        • ID (uint32)
        • value (değişken uzunluk: ek özelliğin uzunluğu - 4 bayt)
        • ID - 0x3ba06f8c
        • value - Rotasyon kanıtı yapısı
    • minSDK (uint32) - imzalı veri bölümündeki minSDK değerinin kopyasıdır. Mevcut platform aralıkta değilse bu imzanın doğrulamasını atlamak için kullanılır. İmzalı veri değeriyle eşleşmelidir.
    • maxSDK (uint32) - imzalı veri bölümündeki maxSDK değerinin kopyasıdır. Mevcut platform aralık dışındaysa bu imzanın doğrulamasını atlamak için kullanılır. İmzalı veri değeriyle eşleşmelidir.
    • Uzunluk ön ekiyle başlayan signatures'nin uzunluk ön ekiyle başlayan dizisi:
      • signature algorithm ID (uint32)
      • length-prefixed signature over signed data
    • uzunluk ön ekiyle public key (SubjectPublicKeyInfo, ASN.1 DER biçimi)

Rotasyon kanıtı ve self-trusted-old-certs yapıları

Rotasyon kanıtı yapısı, uygulamaların iletişim kurdukları diğer uygulamalarda engellenmeden imzalama sertifikalarını döndürmelerine olanak tanır. Bunu yapmak için uygulama imzaları iki yeni veri parçası içerir:

  • Uygulamanın imzalama sertifikasının, önceki sürümlerine güvenildiği her yerde güvenilebileceğine dair üçüncü taraflar için beyan
  • Uygulamanın hâlâ güvendiği eski imzalama sertifikaları

İmzalı veriler bölümündeki rotasyon kanıtı özelliği, tek bağlantılı bir listeden oluşur. Her düğüm, uygulamanın önceki sürümlerini imzalamak için kullanılan bir imzalama sertifikası içerir. Bu özelliğin, kavramsal rotasyon kanıtı ve kendi kendine güvenen eski sertifikalar veri yapılarını içermesi amaçlanmıştır. Liste, kök düğüme karşılık gelen en eski imzalama sertifikasıyla sürüme göre sıralanır. Dönüşüm kanıtı veri yapısı, her düğümdeki sertifikanın listedeki bir sonrakini imzalaması ve böylece her yeni anahtara eski anahtarlar kadar güvenilebileceğine dair kanıt eklemesi yoluyla oluşturulur.

self-trusted-old-certs veri yapısı, her düğüme kümedeki üyeliğini ve özelliklerini belirten işaretler eklenerek oluşturulur. Örneğin, belirli bir düğümdeki imzalama sertifikasının Android imza izinleri almak için güvenilir olduğunu belirten bir işaret bulunabilir. Bu işaret, eski sertifika ile imzalanan diğer uygulamalara yeni imzalama sertifikasıyla imzalanan bir uygulama tarafından tanımlanan bir imza izninin verilmesine olanak tanır. Rotasyon kanıtı özelliğinin tamamı v3 signer alanının imzalı veri bölümünde bulunduğundan, içeren APK'yı imzalamak için kullanılan anahtarla korunur.

Bu biçim, birden fazla imzalama anahtarının ve farklı üst imzalama sertifikalarının tek bir sertifika altında toplanmasını (ortak bir alıcının birden fazla başlangıç düğümü) engeller.

Biçim

Rotasyon kanıtı, APK imza şeması v3 bloğunda 0x3ba06f8c kimliği altında depolanır. Biçimi şu şekildedir:

  • Uzunluk ön ekiyle başlayan levels'nin uzunluk ön ekiyle başlayan dizisi:
    • uzunluk ön ekiyle signed data (önceki sertifika varsa)
      • uzunluk ön ekiyle X.509 certificate (ASN.1 DER formu)
      • signature algorithm ID (uint32): Sertifika tarafından önceki seviyede kullanılan algoritma
    • flags (uint32) - bu sertifikanın self-trusted-old-certs yapısında bulunup bulunmaması gerektiğini ve hangi işlemler için bulunacağını belirten işaretler.
    • signature algorithm ID (uint32): Sonraki seviyedeki imzalı veri bölümündeki değerle eşleşmelidir.
    • uzunluk ön ekiyle signature yukarıdaki signed data

Birden fazla sertifika

Birden fazla imzalayan desteklenmez ve Google Play, birden fazla sertifikayla imzalanmış uygulamaları yayınlamaz.

Doğrulama

Android 9 ve sonraki sürümlerde APK'lar APK İmza Şeması v3, v2 veya v1'e göre doğrulanabilir. Eski platformlar v3 imzalarını yoksayar ve v2 imzalarını, ardından v1 imzalarını doğrulamaya çalışır.

APK imza doğrulama süreci

Şekil 1. APK imza doğrulama süreci

APK imza şeması v3 doğrulaması

  1. APK imzalama bloğunu bulun ve şunları doğrulayın:
    1. APK imzalama bloğunun iki boyut alanı aynı değeri içeriyor.
    2. ZIP Merkezi Dizin'in hemen ardından ZIP Merkezi Dizin Sonu kaydı gelir.
    3. ZIP End of Central Directory'nin (Merkezi Dizinin Sonu) ardından daha fazla veri gelmez.
  2. APK imzalama bloğunun içindeki ilk APK imza şeması v3 bloğunu bulun. v3 bloğu varsa 3. adıma geçin. Aksi takdirde, APK'yı v2 şemasını kullanarak doğrulamaya geçin.
  3. APK imza şeması v3 bloğundaki her signer için mevcut platformun aralığındaki minimum ve maksimum SDK sürümü:
    1. signatures arasından en güçlü desteklenen signature algorithm ID'yi seçin. Güç sıralaması her uygulama/platform sürümüne bağlıdır.
    2. public key kullanarak signatures'daki ilgili signature'yi signed data ile karşılaştırın. (signed data artık ayrıştırılabilir.)
    3. İmzalı verilerdeki minimum ve maksimum SDK sürümlerinin signer için belirtilen sürümlerle eşleştiğini doğrulayın.
    4. digests ve signatures'daki imza algoritması kimliklerinin sıralı listesinin aynı olduğundan emin olun. (Bu, imzanın kaldırılmasını/eklenmesini önlemek içindir.)
    5. İmza algoritması tarafından kullanılan özet algoritmasıyla aynı özet algoritmasını kullanarak APK içeriğinin özetini hesaplayın.
    6. Hesaplanan özetin, digests'daki ilgili digest ile aynı olduğundan emin olun.
    7. certificates'un ilk certificate öğesinin SubjectPublicKeyInfo değerinin public key ile aynı olduğunu doğrulayın.
    8. signer için döndürme kanıtı özelliği varsa yapının geçerli olduğundan ve bu signer'nin listedeki son sertifika olduğundan emin olun.
  4. Mevcut platformun aralığında tam olarak bir signer bulunursa ve bu signer için 3. adım başarılı olursa doğrulama başarılı olur.

Doğrulama

Cihazınızın v3'ü düzgün şekilde destekleyip desteklemediğini test etmek için PkgInstallSignatureVerificationTest.javacts/hostsidetests/appsecurity/src/android/appsecurity/cts/'te CTS testlerini çalıştırın.