APK 簽署配置 v3.1

總覽

Android 13 支援 APK 簽署配置 v3.1,這是對現有 APK 簽署配置 v3 的改良。v3.1 配置解決了 APK Signature Scheme v3 的旋轉相關問題。具體來說,v3.1 簽章配置文件支援 SDK 版本指定功能,可讓輪替指定較新的平台版本。

v3.1 簽署方案使用區塊 ID,但 Android 12 以下版本無法辨識這項資訊。因此,平台會套用下列簽署者行為:

  • 搭載 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 版本。如果指定的 SDK 版本低於 Android 13,系統會使用原始的 v3 區塊,以支援旋轉功能。v3.1 簽署區塊僅會在旋轉功能存在且旋轉功能的最低 SDK 版本設為 Android 13 以上版本時使用。v3 簽署區塊將提供新的屬性,用於輪替 minSdkVersion 去除保護機制。

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,除非簽署系譜中的先前金鑰具有回溯功能,但這項功能會破壞輪替的目的,因為它會允許新的套件更新使用先前的簽署金鑰簽署,並回溯已輪替的金鑰。
  • 如果 APK 僅使用輪替金鑰簽署,之後再使用原始金鑰和輪替金鑰簽署的 APK 更新,在執行 Android 11 以下版本的裝置上,該 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 設定會同時包含原始簽署設定和最新的旋轉簽署設定。我們已建立第 4 版簽名配置,其中包含第 3.1 版區塊中每個簽署設定的額外簽署資訊區塊。

驗證

如要測試您實作 v3.1 的結果,請在 cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ 中執行 PkgInstallSignatureVerificationTest.java CTS 測試。

如要進一步瞭解測試,請參閱 v3 中的「驗證」一節。