APK 簽署配置 3.1 版

概述

Android 13 支援 APK 簽章方案 v3.1,這是現有APK 簽章方案 v3的改進。 v3.1 方案解決了 APK 簽章方案 v3 中有關輪換的一些已知問題。特別是,v3.1 簽章方案支援 SDK 版本定位,允許輪換以定位平台的更高版本。

v3.1 簽章方案使用 Android 12 或更低版本無法辨識的區塊 ID。因此,平台應用以下簽署者行為:

  • 運行 Android 13 或更高版本的裝置使用 v3.1 區塊中的輪換簽署者。
  • 運行舊版 Android 的裝置會忽略輪換的簽署者,而是使用 v3 區塊中的原始簽署者。

尚未輪換簽署金鑰的應用程式不需要任何其他操作。每當這些應用程式選擇輪換時,系統都會預設應用 v3.1 簽章方案。

v3.1 簽名區塊

v3.1 簽名區塊將具有與 v3 簽名區塊相同的內容,但使用新的區塊 ID,這些簽名將僅在運行 Android 13 及更高版本的裝置上識別。這允許應用程式安全地輪換其簽章金鑰,而無需擔心多目標 APK,因為原始簽章者可用於對 v3 簽章區塊中的 APK 進行簽名,而輪替簽章者可用於在 v3.1 簽章區塊中簽章。這也允許平台在驗證 v3.1 簽章時重複使用 v3 簽章區塊的所有現有驗證碼。

預設情況下,只要簽章配置中提供了輪換金鑰和沿襲, apksig函式庫就會使用 v3.1 簽章區塊。如果套用的minSdkVersion低於 Android 13 並且正在使用輪換金鑰,則還必須指定原始簽章金鑰,以便可以使用它在 v3 簽章區塊中對 APK 進行簽章。這與目前的行為類似,如果 APK 的目標版本早於 Android 9,則需要原始簽署者。

為了支援從特定 SDK 版本開始的目標金鑰輪換, apksig庫將公開新的 API,允許設定輪換的最低 SDK 版本如果將低於 Android 13 的 SDK 版本指定為輪換支援的最低版本,則原始 v3將使用塊。 v3.1 簽章區塊僅在有輪換的情況下使用,其中輪換的最低 SDK 版本設定為 Android 13 及更高版本。 v3 簽章區塊將具有用於旋轉最低 SDK 版本剝離保護的新屬性。

APK 包含 Lineage rotation-min-sdk-version 的值v3 簽名區塊v3.1 簽名區塊
預設值或任意值(下面用x表示)由原始簽署者簽名,針對 Android 9 及更高版本不存在
是的預設由原始簽署者簽名,針對 Android 9 至 12L使用輪換簽名者進行簽名,針對 Android 13 及更高版本
是的x < 33 (Android 13)使用輪換簽名者進行簽名,針對 Android 9 及更高版本不存在
是的x >= 33(Android 13)由原始簽署者簽名,針對 Android 9 - ( x -1)使用輪換簽名者簽名,目標為x+

輪換相關問題

平台中已解決以下與旋轉相關的問題:

Android 12 修復

  • 只有當任一應用程式的目前簽署者位於簽章譜系中,或是另一個應用程式的目前簽署者時,平台才會向請求應用程式授予簽名權限;如果兩個應用程式遵循簽名密鑰最佳實踐並輪換到不同的簽名密鑰,這將阻止向請求的應用程式授予簽名權限。
  • 平台的 APK 回滾功能無法回滾剛剛輪換簽章金鑰的 APK,除非簽章譜系中的前一個金鑰具有回滾功能,但此功能違背了輪替的目的,因為它允許新的軟體包更新由先前的簽署金鑰並回滾旋轉的金鑰。
  • 在運行 Android 11 及更早版本的裝置上,僅使用輪換密鑰簽署並隨後使用使用原始密鑰和沿襲中的輪換密鑰簽署的 APK 進行更新的 APK 將僅在沿襲中顯示輪換密鑰。

Android 11 修復

  • PackageManager#checkSignatures未正確更新以檢查兩個套件的原始簽署金鑰。這會破壞使用旋轉簽署金鑰的應用程式的偵測以及使用原始簽章金鑰的偵測APK。
  • sharedUserId下的套件共用它們的簽名譜系。每當在sharedUiserId中安裝或更新具有更新的簽名沿襲的應用程式時,該應用程式的沿襲就會替換sharedUserId的共享沿襲(也就是說,如果應用程式的簽名沿襲是A->B,並且應用程式在sharedUserId中更新)沿襲 B -> C,則sharedUserId沿襲將替換為 B -> C)。類似地,除非簽名世系發生更改,否則無法更新世系中先前簽名者的能力。

v4 集成

v4簽章方案使用提供給apksigner的簽章配置;如果為輪換提供了多個簽名配置,則使用最新的輪換簽名配置。在引入 v3.1 之前,v3 僅包含最新的輪換簽名配置,因此 v4 能夠按原樣使用此配置;這樣,v4 簽章方案就能夠支援輪換,因為它在 SigningInfo 中使用了輪換的簽章金鑰。雖然 v4 SigningInfo 不包含完整的簽名沿襲,但它能夠從 v3 簽名塊中提取此信息,以允許平台訪問任何簽名查詢的沿襲。當 v3.1 用於針對所提供的rotation-min-sdk-version 進行輪換時,通用 v3 配置將包括原始簽名配置以及最新的輪換簽名配置。 v4 簽章方案的擴充功能已創建,其中包括 v3.1 區塊中每個簽章配置的附加簽章資訊區塊。

驗證

若要測試 v3.1 的實現,請在cts/hostsidetests/appsecurity/src/android/appsecurity/cts/中執行PkgInstallSignatureVerificationTest.java CTS 測試。

有關測試的更多信息,請查看 v3 中的驗證部分。