Android 13 поддерживает схему подписи APK версии 3.1, которая является улучшением по сравнению с существующей схемой подписи APK версии 3. Схема версии 3.1 устраняет некоторые известные проблемы схемы подписи APK версии 3, касающиеся поворота экрана. В частности, схема подписи версии 3.1 поддерживает целевую версию SDK, что позволяет поворачивать экран для более поздней версии платформы.
В схеме подписи версии 3.1 используется идентификатор блока, который не распознается в Android 12 и более ранних версиях. Поэтому платформа применяет следующее поведение подписывающего лица:
- Устройства, работающие под управлением Android 13 или выше, используют повернутую подпись в блоке v3.1.
- Устройства, работающие под управлением более старых версий Android, игнорируют повернутую подпись и вместо этого используют исходную подпись в блоке v3.
Приложениям, которые еще не сменили ключ подписи, никаких дополнительных действий не требуется. Когда эти приложения решат сменить ключ, система по умолчанию будет применять схему подписи версии 3.1.
блок подписи v3.1
Блок подписи версии 3.1 имеет то же содержимое, что и блок подписи версии 3, но с новым идентификатором блока эти подписи распознаются только на устройствах под управлением Android 13 и выше. Это позволяет приложениям безопасно менять свои ключи подписи, не беспокоясь о многоцелевых APK-файлах, поскольку исходный подписант может использоваться для подписи APK в блоке подписи версии 3, а измененный подписант — в блоке подписи версии 3.1. Это также позволяет платформе повторно использовать все существующие коды проверки для блока подписи версии 3 при проверке подписи версии 3.1.
По умолчанию библиотека apksig использует блок подписи версии 3.1 всякий раз, когда в конфигурации подписи указан повернутый ключ и информация о происхождении. Если minSdkVersion приложения меньше Android 12 и используется повернутый ключ, необходимо также указать исходный ключ подписи, чтобы его можно было использовать для подписи APK в блоке подписи версии 3. Это аналогично текущему поведению, когда требуется указать исходного подписывающего, если APK ориентирован на версию младше Android 9.
Для поддержки переключения клавиш, начиная с определенной версии SDK, библиотека apksig предоставляет новые API, позволяющие устанавливать минимальную версию SDK для переключения клавиш. Если в качестве минимальной версии для поддержки переключения клавиш указана версия SDK ниже Android 12, используется исходный блок v3. Блок подписи v3.1 используется только при наличии переключения клавиш, если минимальная версия SDK для переключения клавиш установлена на Android 12 и выше. Блок подписи v3 имеет атрибут для защиты от удаления минимальной версии SDK при переключении клавиш.
| APK включает в себя информацию о происхождении. | Значение rotation-min-sdk-version | блок подписи v3 | блок подписи v3.1 |
|---|---|---|---|
| Нет | Значение по умолчанию или любое другое значение (обозначенное буквой x ниже). | Подписано первоначальным подписантом, ориентировано на Android 9 и выше. | Отсутствует |
| Да | По умолчанию | Подписано первоначальным подписантом, ориентировано на Android 9–12L | Подписано с использованием смещенного подписанта, ориентировано на Android 12 и выше. |
| Да | 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. Хотя SigningInfo v4 не включает полную историю подписи, она может получить ее из блока подписи v3, чтобы предоставить платформе доступ к истории для любых запросов подписи. Когда v3.1 используется для целевой ротации для предоставленной версии rotation-min-sdk-version, общая конфигурация v3 включает как исходную конфигурацию подписи, так и последнюю ротированную конфигурацию подписи. Было создано расширение схемы подписи v4, которое включает дополнительные блоки информации о подписи для каждой из конфигураций подписи из блока v3.1.
Проверка
Для проверки вашей реализации версии 3.1 запустите тесты CTS PkgInstallSignatureVerificationTest.java , расположенные в cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .
Для получения более подробной информации о тестировании ознакомьтесь с разделом проверки в версии 3.