Google стремится к продвижению расового равенства для чернокожего населения. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

APK Подпись Схема v3

Android 9 поддерживает APK ключевого поворота , который дает приложению появится возможность изменить свой ключ подписи , как часть обновления APK. Для того, чтобы вращение практично, APK-необходимо указать уровень доверия между новым и старым ключом подписи. Для поддержки поворота ключа, мы обновили схему подписи APK с v2 на v3 , чтобы новые и старые ключи , которые будут использоваться. V3 добавляет информацию о поддерживаемых версиях SDK и корректуры из-вращения структуры к блоку APK подписи.

APK Подписание блока

Для того, чтобы поддерживать обратную совместимость с форматом APK v1, v2 и v3 APK подписи хранятся внутри APK подписывающегося блок, расположенный непосредственно перед ЗИП Central Directory.

V3 АПК подпись формата блок является таким же , как v2 . V3 подпись APK хранится в виде ИД-пары значений с ID 0xf05368c0.

Подпись АПК Схема v3 Блок

Схема v3 предназначена быть очень похожа на схему v2 . Она имеет тот же общий формат и поддерживает те же идентификаторы подписи алгоритма , основные размеры и кривые ЕС.

Однако схема v3 добавляет информацию о поддерживаемых версиях SDK и структуре корректуры из-вращения.

Формат

Подпись АПК Схема v3 Блок хранится внутри APK подписывающегося блока под ID 0xf05368c0 .

Формат APK Подпись Схема блока v3 следует, что из v2:

  • длина префикса последовательность длиной префикса signer :
    • длина префикса signed data :
      • длина префикса последовательность длиной префикса digests :
        • signature algorithm ID (4 байта)
        • digest (длина префикса)
      • длина префикса последовательность X.509 certificates :
        • Длина префикса Х.509 certificate (ASN.1 форма МЭД)
      • minSDK (uint32) - это подписавшийся должен быть проигнорирован , если платформа версии ниже этого числа.
      • maxSDK (uint32) - это подписавшийся должен быть проигнорирован , если платформа версии выше этого числа.
      • длина префикса последовательность длины префикса additional attributes :
        • ID (uint32)
        • value (переменная длина: длина дополнительного атрибута - 4 байта)
        • ID - 0x3ba06f8c
        • value - Доказательство-оф-вращения STRUCT
    • minSDK (uint32) - дубликат значения minSDK в подписанных секциях данных - используется для пропуска проверки этой подписи , если текущая платформа не находится в диапазоне. Должно соответствовать подписанному значению данных.
    • maxSDK (uint32) - дубликат значения maxSDK в разделе подписанных данных - используется для пропуска проверки этой подписи , если текущая платформа не находится в диапазоне. Должно соответствовать подписанному значению данных.
    • длина префикса последовательность длиной префикса signatures :
      • signature algorithm ID (uint32)
      • Длина префикса signature над signed data
    • Длина префикса public key (SubjectPublicKeyInfo, ASN.1 DER - форма)

Proof-оф-вращения и самостоятельно доверенный-старослужащих сертификаты структур

Доказательство вращения структуры позволяет приложениям, чтобы повернуть их подписание сертификата без блокирования других приложений, с которыми они общаются. Для достижения этой цели, подписи приложение содержит два новых элемента данных:

  • утверждение для третьих сторон, подписание серто для приложения можно доверять, где его предшественник доверяют
  • приложения старые подписи сертификаты которых само приложение по-прежнему доверяет

Атрибут корректуры из-вращения в секции зарегистрированы данные состоит из однократный связанного списка, с каждым узлом, содержащим сертификат подписи, используемым для подписи предыдущих версий приложения. Этот атрибут предназначен для содержать концептуальные доказательства правильности вращения и самостоятельно доверенного-старослужащих сертификатов структур данных. Список упорядочен по версии с старейшим подписанием серта соответствующим корневым узлом. Структура данных корректуры из-вращения строятся при наличии сертификата в каждом узле подписать следующий в списке, и, таким образом, наполняя каждый новый ключ с доказательством того, что он должен быть как доверенный как старый ключ (ов).

Структура данных самостоятельно доверенный-старые-сертификатов строятся путем добавления флагов каждого узла с указанием его членства и свойства в наборе. Например, флаг может присутствовать, указывающий, что сертификат подписи в данном узле является доверенным для получения разрешения для Android подписи. Этот флаг позволяет другим приложениям, подписанные старшим сертификат по-прежнему быть предоставлены разрешение подписи, определяемое приложением, подписанным с новым сертификатом подписи. Поскольку весь атрибут пребывает корректуры из-вращения в секции подписанных данных v3 signer поля, она защищена ключом , используемым для подписания содержащего APK.

Этот формат не позволяет несколько ключей подписи и конвергенции различных сертификатов предок подписи к одному (нескольких исходных узлам к общей раковине).

Формат

Вращения доказательства правильности хранятся внутри APK подписи Схема v3 блока под ID 0x3ba06f8c . Его формат:

  • длина префикса последовательность длиной префикса levels :
    • длина префикса signed data (по предыдущим CERT - если существует)
      • Длина префикса Х.509 certificate (ASN.1 форма МЭД)
      • signature algorithm ID (uint32) - алгоритм , используемый CERT в предыдущем уровне
    • flags (UInt32) - флаги , указывающие , должна ли это быть серто в структурах самоуправления доверенного-старого-CERTS, и для которых операции.
    • signature algorithm ID (uint32) - должно соответствовать одному из раздела подписанных данных в следующем уровне.
    • Длина префикса signature за выше signed data

Несколько сертификатов

Android в настоящее время лечит APK, подписанный с несколькими сертификатами, как имеющие уникальную идентичность подписи отдельно от содержащих сертификаты. Таким образом, доказательство правильность вращения атрибут в разделе знаковых-данных образует направленный ациклический граф, который мог бы лучше рассматривать как однократно связанный список, с каждым набором подписчиков для данной версии, представляющей один узел. Это добавляет дополнительную сложность корректуры из-вращения структуры (версия мульти-подписавшийся ниже). В частности, упорядочение становится проблемой. Более того, это уже не возможно подписать APK-самостоятельно, так как структура доказательства правильности вращения должна иметь старые подписи сертификатов подписывая новый набор сертификатов, а не подписывая их один за другим. Например, APK подписываются ключ, который желает быть подписаны два новых ключами B и C не может иметь B подписавшегося просто включить подпись А или В, потому что это другая идентичности подписи, чем В и С. Это означает, что подписант должны координировать прежде чем строить такую ​​структуру.

Несколько подписанты корректуры из-вращения атрибута

  • длина префикса последовательность длиной префикса sets :
    • signed data (по предыдущему набору - если существует)
      • длина префикса последовательность certificates
        • Длина префикса Х.509 certificate (ASN.1 форма МЭД)
      • Последовательность signature algorithm IDs (UInt32) - по одному для каждого сертификата из предыдущего набора, в том же порядке.
    • flags (UInt32) - флаги , указывающие или нет этого набор должен быть сертификаты в себя доверенный-старой-CERTS структуре, и для которых операции.
    • длина префикса последовательность длиной префикса signatures :
      • signature algorithm ID (uint32) - должно соответствовать одному из раздела подписанных данных
      • Длина префикса signature за выше signed data

Несколько предков в доказательство из-вращения структуры

Схема v3 также не обрабатывает два разных ключа вращаясь тот же ключ подписи для одного приложения. Это отличается от случая приобретения, где приобретающее общество хотело бы переместить приобретенное приложение, чтобы использовать его ключ подписи для разрешения на акцию. Приобретение рассматривается как поддерживаемый потребительной случае, потому что новое приложение будет отличать его имя пакета и может содержать свою собственную доказательство из-вращения структуры. Неподдерживаемый случае, одного и того же приложения, имеющего два разных пути, чтобы добраться до той же серт, ломает много предположений, сделанных в ключе конструкции вращения.

верификация

В Android 9 и выше, APK-могут быть проверены в соответствии с АПК Подпись схеме v3, v2, схемы или схемы v1. Старые платформы игнорировать v3 подписей и попытаться проверить v2 подписей, то v1.

APK процесс проверки подписи

Рисунок процесс верификации подписи 1. АПК

Подпись АПК проверки Схема v3

  1. Найдите APK подписи блока и убедитесь, что:
    1. Два поля размера АПК подписание блока содержат одинаковое значение.
    2. ZIP Центральный Справочник сразу после ZIP Конец записи Central Directory.
    3. ZIP Конец Центрального каталога не следует больше данных.
  2. Найдите первый APK Подпись Схема v3 блока внутри APK Подписание блока. Если v3 блок присутствует, переходите к шагу 3. В противном случае, падение обратно к проверке APK с использованием схемы v2 .
  3. Для каждого signer в APK Подписи Схема v3 блок с минимальным и максимальной версией SDK , которая находится в диапазоне от текущей платформы:
    1. Выберите самую сильную поддерживаются signature algorithm ID из signatures . Упорядочение прочности до каждой версии реализации / платформы.
    2. Проверьте соответствующую signature от signatures против signed data с использованием public key . (Теперь можно безопасно разобрать signed data .)
    3. Проверьте мин и макс SDK версии в подписанных данных соответствуют данным для signer .
    4. Убедитесь в том, что упорядоченный список идентификаторов алгоритма подписи в digests и signatures идентичны. (Это должно предотвратить подпись зачистки / добавление).
    5. Вычислить дайджест содержание APK , используя тот же алгоритм , как дайджест дайджест алгоритм , используемый алгоритмом подписи.
    6. Убедитесь , что вычисленная дайджеста идентична соответствующим digest из digests .
    7. Убедитесь в том, что SubjectPublicKeyInfo первого certificate о certificates идентичен public key .
    8. Если атрибут корректуры из-вращения существует для signer убедитесь , что структура является действительной , и это signer последним сертификат в списке.
  4. Проверка успешна , если точно один signer был найден в пределах текущей платформы и шага 3 удалось для этого signer .

Проверка

Для того, чтобы проверить , что ваш поддерживает устройство v3 правильно, запустите PkgInstallSignatureVerificationTest.java тесты CTS в cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .