Как подписать пакет приложения с помощью SignTool

Примечание.

Сведения о подписи пакета приложения Windows см. в статье "Подписывание пакета приложения с помощью SignTool".

Узнайте, как использовать SignTool для подписывания пакетов приложений Windows, чтобы их можно было развернуть. SignTool является частью пакета SDK для программного обеспечения Windows.

Все пакеты приложений Windows должны быть цифрово подписаны перед развертыванием. Хотя Microsoft Visual Studio 2012 и более поздних версий могут подписать пакет приложения во время его создания, пакеты, создаваемые с помощью средства пакета приложений (MakeAppx.exe) из пакета SDK для Windows, не подписаны.

Примечание.

Вы можете использовать signTool только для подписывания пакетов приложений Windows в Windows 8 и более поздних версиях или Windows Server 2012 и более поздних версий. Вы не можете использовать SignTool для подписывания пакетов приложений на уровне операционных систем нижнего уровня, таких как Windows 7 или Windows Server 2008 R2.

Это важно знать

Технологии

Необходимые компоненты

  • SignTool, который является частью пакета SDK для Windows

  • Допустимый сертификат подписи кода, например файл Обмена персональными данными (PFX), созданный с помощью средств MakeCert.exe и Pvk2Pfx.exe

    Сведения о создании допустимого сертификата подписи кода см. в статье "Создание сертификата подписи пакета приложения".

  • Упаковаемое приложение Windows, например, файл .appx, созданный с помощью средства упаковщика приложений (MakeAppx.exe)

Дополнительные рекомендации

Сертификат, используемый для подписи пакета приложения, должен соответствовать следующим критериям:

  • Имя субъекта сертификата должно соответствовать атрибуту Publisher, который содержится в элементе Identity файла AppxManifest.xml, хранящегося в пакете. Имя издателя является частью удостоверения упаковаемого приложения Windows, поэтому необходимо сделать имя субъекта сертификата соответствующим имени издателя приложения. Это позволяет проверка удостоверения подписанных пакетов с цифровой подписью. Сведения об ошибках подписывания, которые могут возникнуть при подписи пакета приложения с помощью SignTool, см. в разделе "Примечания" статьи "Создание сертификата подписи пакета приложения".

  • Сертификат должен быть допустимым для подписи кода. Это означает, что оба этих элемента должны иметь значение true:

    • Поле расширенного использования ключей (EKU) сертификата должно быть не задано или содержит значение EKU для подписывания кода (1.3.6.1.5.5.7.3.3).
    • Поле использования ключей (KU) сертификата должно быть не задано или содержит бит использования для цифровой подписи (0x80).
  • Сертификат содержит закрытый ключ.

  • Сертификат действителен. Оно активно, не истекло и не было отменено.

Instructions

Шаг 1. Определение хэш-алгоритма для использования

При подписи пакета приложения необходимо использовать тот же хэш-алгоритм, который использовался при создании пакета приложения. Если вы использовали параметры по умолчанию для создания пакета приложения, используется хэш-алгоритм SHA256.

Если вы использовали упаковщик приложений с определенным хэш-алгоритмом для создания пакета приложения, используйте тот же алгоритм для подписи пакета. Чтобы определить хэш-алгоритм, используемый для подписывания пакета, можно извлечь содержимое пакета и проверить файл AppxBlockMap.xml. Атрибут HashMethod элемента BlockMap указывает хэш-алгоритм, используемый при создании пакета приложения. Например:

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

Предыдущий элемент BlockMap указывает, что использовался алгоритм SHA256. В этой таблице перечислены сопоставления доступных в настоящее время алгоритмов:

Значение HashMethod hashAlgorithm для использования
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (.appx по умолчанию)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

Шаг 2. Запуск SignTool.exe для подписи пакета

Подписывание пакета с помощью сертификата подписи из PFX-файла

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

SignTool по умолчанию использует параметр /fd hashAlgorithm в SHA1, если он не указан, и SHA1 недействителен для подписывания пакетов приложений. Поэтому этот параметр необходимо указать при подписи пакета приложения. Чтобы подписать пакет приложения, созданный с помощью хэша SHA256 по умолчанию, укажите параметр /fd hashAlgorithm как SHA256:

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

Параметр пароля /p можно опустить, если используется PFX-файл, который не защищен паролем. Вы также можете использовать другие параметры выбора сертификата, поддерживаемые SignTool для подписывания пакетов приложений. Дополнительные сведения об этих параметрах см. в разделе SignTool.

Примечание.

Невозможно использовать операцию метки времени signTool в подписанном пакете приложения. Эта операция не поддерживается.

Если требуется метка времени для пакета приложения, необходимо сделать это во время операции подписи. Например:

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

Сделайте параметр /tr timestampServerUrl равным URL-адресу сервера меток времени RFC 3161.

Замечания

В этом разделе описывается устранение ошибок подписывания пакетов приложений.

Устранение ошибок подписывания пакета приложения

Помимо ошибок подписывания, которые могут возвращать SignTool, SignTool также может возвращать ошибки, относящиеся к подписи пакетов приложений. Эти ошибки обычно отображаются как внутренние ошибки:

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

Если код ошибки начинается с 0x8008, например 0x80080206 APPX_E_CORRUPT_CONTENT), он указывает, что подписанный пакет недопустим. В этом случае перед подписью пакета необходимо перестроить пакет. Полный список ошибок 0x8008* см. в разделе COM-коды ошибок (безопасность и настройка).

Чаще всего ошибка 0x8007000b (ERROR_BAD_FORMAT). В этом случае в журнале событий можно найти более конкретные сведения об ошибках:

Поиск в журнале событий

  1. Запустите Eventvwr.msc.
  2. Откройте журнал событий: Просмотр событий (локальные) > приложения и службы журналы > Microsoft Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging>/Operational
  3. Найдите последнее событие ошибки.

Внутренняя ошибка обычно соответствует одному из следующих:

ИД события Пример строки события Предложение
150 ошибка 0x8007000B. Имя издателя манифеста приложения (CN=Contoso) должно соответствовать имени субъекта сертификата подписи (CN=Contoso, C=US). Имя издателя манифеста приложения должно точно совпадать с именем субъекта подписи. Примечание. Эти имена указываются в кавычках и являются конфиденциальными как регистром, так и пробелами.
Вы можете обновить строку атрибута Publisher , определенную для элемента Identity в файле AppxManifest.xml, чтобы соответствовать имени субъекта предполагаемого сертификата подписи. Или выберите другой сертификат подписи с именем субъекта, который соответствует имени издателя манифеста приложения. Имя издателя манифеста и имя субъекта сертификата указаны в сообщении о событии.
151 ошибка 0x8007000B. Указанный метод хэша подписи (SHA512) должен соответствовать хэш-методу, используемому в карте блоков пакета приложения (SHA256). ХэшAlgorithm, указанный в параметре /fd, неверный (см. шаг 1. Определение используемого хэш-алгоритма). Повторно запустите SignTool с хэшОмAlgorithm, который соответствует карте блока пакета приложения.
152 ошибка 0x8007000B. Содержимое пакета приложения должно проверяться на основе его карты блоков. Пакет приложения поврежден и должен быть перестроен для создания новой карты блоков. Дополнительные сведения о создании пакета приложения см. в статье о создании пакета приложения с помощью упаковщика приложений или создании пакета приложения с помощью Visual Studio 2012.

Соображения безопасности

После подписания пакета сертификат, используемый для подписи пакета, по-прежнему должен быть доверенным компьютером, на котором будет развернут пакет. Добавив сертификат в хранилища сертификатов локального компьютера, вы влияете на доверие сертификатов всех пользователей на компьютере. Мы рекомендуем установить все сертификаты подписывания кода, которые требуется для тестирования пакетов приложений в хранилище сертификатов доверенных Люди, и быстро удалить эти сертификаты, если они больше не нужны. Если вы создаете собственные тестовые сертификаты для подписывания пакетов приложений, рекомендуется также ограничить привилегии, связанные с тестируемым сертификатом. Дополнительные сведения о создании тестовых сертификатов для подписывания пакетов приложений см. в статье "Создание сертификата подписи пакета приложения".

Примеры

Создание примера пакета приложения

Основные понятия

Рекомендации по подписанию кода

Подписание пакета в Visual Studio 2012

SignTool

Упаковщик приложений (MakeAppx.exe)

Создание сертификата для подписи пакета приложения