Цифровые подписи для модулей ядра в системах под управлением Windows Vista

 

Microsoft Corporation

Обновлено в июне 2007 г.

Область применения:
   Windows Vista
   Windows Server 2008

Сводка: Для Microsoft Windows Vista и более поздних версий семейства операционных систем Windows программное обеспечение в режиме ядра должно иметь цифровую подпись для загрузки в 64-разрядных компьютерных системах. Узнайте, как управлять процессом подписывания программного обеспечения в режиме ядра для Windows Vista. (22 печатных страницы.)

Текущая версия этого документа хранится в Интернете по адресу: https://www.microsoft.com/whdc/system/platform/64bit/kmsigning.mspx.

Содержимое

Введение
   Рекомендации по использованию цифровых подписей
   Параметры подписывания кода в режиме ядра
Процесс подписывания кода в режиме ядра
   Получение сертификата публикации программного обеспечения (SPC)
   Создание подписанного CAT-файла
   Добавление внедренной подписи в файл образа драйвера
Отключение принудительного применения подписей во время разработки
Использование тестовой подписи
   Включение устранения неполадок с подписыванием тестов
   Обнаружение ошибок загрузки драйверов
   Включение событий системного журнала диагностики целостности кода
   Параметры отладки проверки драйвера
Ресурсы

Введение

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

Цифровые подписи позволяют администратору или конечному пользователю, устанавливающему программное обеспечение на базе Windows, узнать, предоставил ли пакет программного обеспечения законный издатель. Когда пользователи отправляют отчеты об ошибках Windows данные в корпорацию Майкрософт после сбоя или другой ошибки, корпорация Майкрософт может проанализировать данные, чтобы узнать, какое программное обеспечение издателей было запущено в системе во время ошибки. Затем издатели программного обеспечения могут использовать информацию, предоставленную корпорацией Майкрософт, для поиска и устранения проблем в программном обеспечении.

Windows Vista использует цифровые подписи в коде режима ядра, чтобы повысить безопасность и стабильность платформы Microsoft Windows и обеспечить новые возможности взаимодействия с клиентами с премиум-контентом следующего поколения:

  • Драйверы должны быть подписаны для устройств, которые передают защищенное содержимое. Сюда входят аудиодрайверы, использующие защищенный звук в пользовательском режиме (PUMA) и защищенный звуковой путь (PAP), а также драйверы видеоустройств, обрабатывающие защищенные команды управления защитой вывода видеопуть-выход (PVP-OPM).
  • Неподписаемое программное обеспечение в режиме ядра не загружается и не будет работать в системах на базе 64-разрядных систем.

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

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

  • Для любого компонента режима ядра, который еще не подписан, издатели должны получить сертификат публикации программного обеспечения (SPC) и использовать SPC для подписи всех 64-разрядных программ в режиме ядра, которые будут работать на 64-разрядных компьютерных системах под управлением Windows Vista. Сюда входит программное обеспечение служб в режиме ядра.

  • Издатели, которые предоставляют 64-разрядный драйвер устройства или другое программное обеспечение в режиме ядра, которое уже подписано с помощью программы логотипов Windows, будет иметь каталоги драйверов, подписанные подписью Windows Hardware Quality Labs (WHQL). Чтобы полностью протестировать пакет драйверов перед отправкой в WHQL, подпишите каталог драйверов с помощью SPC.

  • В особом случае драйверов запуска загрузки также необходимо использовать SPC для встраиваемого подписывания файла двоичного образа драйвера для оптимальной производительности загрузки системы.

    Примечание Считается, что драйвер запускает загрузку, если он загружается загрузчиком операционной системы Windows Vista. Драйверы запуска загрузки можно определить следующим образом: в inf-файле драйвера указывается тип запуска "Start=0", или служба ядра настроена с параметром ServiceType в качестве драйвера ядра или драйвер файловой системы и StartMode как "boot".

Обязательная политика подписывания кода в режиме ядра применяется ко всему программному обеспечению в режиме ядра в 64-разрядных системах под управлением Windows Vista. Однако корпорация Майкрософт рекомендует издателям подписывать все программное обеспечение, включая драйверы устройств как для 32-разрядных, так и для 64-разрядных платформ. Windows Vista выполняет проверку подписи в режиме ядра в системах x86 для поддержки защищенного мультимедийного содержимого. Однако сигнатуры драйвера режима ядра не являются обязательными для 32-разрядных систем.

В этом документе описывается, как управлять процессом подписывания для кода в режиме ядра для Windows Vista, в том числе как получить сертификат публикации программного обеспечения (SPC), рекомендации по защите ключей и как подписать пакет драйвера с помощью средств, предоставляемых в комплекте драйверов Windows (WDK).

Рекомендации по использованию цифровых подписей

С момента выпуска Windows 98 корпорация Майкрософт продвигает подписывание драйверов для назначенных классов устройств в качестве механизма повышения надежности драйвера, улучшения взаимодействия с пользователем, снижения затрат на поддержку поставщиков программного обеспечения и оборудования, а также снижения общей стоимости владения для клиентов.

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

Для большинства пакетов драйверов в режиме ядра цифровая подпись предоставляется в файле подписанного каталога (CAT). Windows Hardware Quality Labs (WHQL) предоставляет подписанный Корпорацией Майкрософт CAT-файл для распространения с пакетом драйверов, который соответствует требованиям программы "Логотип Windows".

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

  • Управление процессом подписывания. Обычно это осуществляется службами управления программами издателей и выпуска программного обеспечения и включает в себя:

    • Выбор соответствующего параметра подписывания.
    • Получение необходимых сертификатов.
    • Управление ключами цифровой подписи или кода.

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

  • Реализация подписанного драйвера. Обычно это выполняется командой разработчиков издателя и включает в себя:

    • Реализация самого драйвера.
    • Создание подписанного пакета драйвера для внутреннего тестирования или выпуска.

Эти процессы описаны для более ранних версий Windows в WDK и пакете SDK для платформы. В этом документе описываются дополнительные параметры, связанные с подписыванием кода в режиме ядра для Windows Vista.

Параметры подписывания кода в режиме ядра

Существует несколько вариантов работы с требованиями к подписывание кода в режиме ядра (KMCS) в Windows Vista. Подписывание файлов драйверов не требуется, чтобы Windows Vista загружала драйверы при разработке кода в режиме ядра. Вместо этого разработчики могут использовать один из механизмов, чтобы временно отключить проверки времени загрузки ядром в системах разработки и неавтоматических тестовых системах. Однако тестовое подписывание пакетов драйверов требуется для автоматизации установки пакета драйверов в тестовых системах без всплывающих окон установки драйверов. Инфраструктура управления драйверами (DMI) проверяет подпись пакета драйверов во время установки и предупреждает пользователей о неподписанных драйверах.

В следующей таблице сравниваются варианты для модулей ядра с цифровой подписью, поддерживаемых Windows Vista.

Параметры подписывания модулей ядра

Параметры подписывания Функциональность проверена на соответствие требованиям к логотипу Удостоверение проверено Предполагаемое использование
Программа "Логотип Windows" Да Да Выпуск
Подписывание кода в режиме ядра с помощью SPC Нет Да Выпуск
Программа WHQL Test Signature Нет Да Тестирование
Подписывание теста KMCS Нет Нет Тестирование

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

Разработчики могут подписать файл образа драйвера или каталог драйверов с помощью SPC для тестирования перед отправкой в WHQL, чтобы убедиться, что драйвер загружается и работает правильно.

Подписывание кода в режиме ядра с помощью SPC обеспечивает возможность идентификации издателя модуля ядра, загружаемого в Windows Vista. Он не обеспечивает какого-либо уровня сертификации функциональности или надежности модуля ядра. Для драйверов, которые не имеют права на логотип Windows или логотип Windows не является одним из требований продукта, издатель может создать CAT-файл для пакета драйверов и подписать его с помощью SPC издателя.

Важно Подписывание кода в режиме ядра не заменяет программу WHQL. Корпорация Майкрософт рекомендует издателям использовать программу с логотипом Windows для обеспечения качества драйверов. Подписывание кода в режиме ядра не требует от издателя программного обеспечения прохождения требований к тестированию программы с логотипом Windows, связанных с WHQL.

Подписанный CAT-файл — это все, что необходимо для правильной установки и загрузки большинства пакетов драйверов в системах x64, за исключением пакетов, содержащих драйвер, загруженный загрузчиком Windows Vista. Пакет драйверов, содержащий драйвер устройства, загруженный загрузчиком Windows Vista, должен быть подписан двумя способами:

  • Двоичный файл драйвера режима ядра, который загружается во время загрузки, должен иметь внедренную сигнатуру в двоичный файл, подписанный с помощью SPC. Для простоты может быть проще вставить все файлы образов драйверов в пакет.
  • Пакет драйверов, установленный с помощью INF-файла, также должен иметь подписанный файл каталога, как и пакеты драйверов, которые не содержат загрузочного драйвера, для проверки подписи во время установки.

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

В целях тестирования во время цикла разработки рекомендуется подписывать код с помощью "тестового" сертификата, а не с помощью сертификата выпуска. Двоичный файл, подписанный тестом, распознается системами Windows Vista только в том случае, если включен параметр конфигурации загрузки, разрешающий использование сертификатов подписи теста. Подписывание тестов по умолчанию не включено, и большинство систем Windows Vista не будут доверять подписям тестов.

Программа WHQL Test Signature также поддерживается для подписывания тестов. Участники программы могут отправлять пакеты драйверов для подписывания тестов WHQL. Подпись в тестовых подписанных каталогах создается сертификатом, выданным корневым центром Microsoft Test. Корневой центр microsoft test принимается, если параметр конфигурации загрузки Windows Vista включает подписывание тестов. Сведения о программе тестовой подписи WHQL см. в разделе Ресурсы в конце этого документа.

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

Тестовое подписывание более подробно рассматривается в разделе Использование тестовой подписи далее в этом документе.

Процесс подписывания кода в режиме ядра

Цифровая подпись файла изображения или каталога в режиме ядра устанавливает целостность подписанного файла или файлов. Программные модули никогда не следует изменять после выполнения операции подписывания кода. Изменение файла образа после подписи кода приводит к сбоям проверки подписи во время установки и загрузки.

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

Как упоминалось ранее, драйверы запуска загрузки должны иметь внедренные сигнатуры в файл образа драйвера. Внедренные сигнатуры в файлах образа драйвера запуска загрузки оптимизируют производительность загрузки операционной системы, устраняя необходимость в поиске файла appropriate.cat, когда загрузчик операционной системы проверяет подпись драйвера.

Подписывание драйвера не требуется для каждой сборки в процессе разработки драйвера. Разработчики могут отключить принудительное применение подписи драйверов, как описано в разделе Отключение принудительного применения подписей во время разработки далее в этом документе.

В следующих разделах описывается, как получить сертификаты и управлять ими. Механизм подписывания пакетов драйверов рассматривается далее в этом документе.

Получение сертификата публикации программного обеспечения (SPC)

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

  1. Получите SPC из коммерческого ЦС, который выдает цифровые сертификаты для подписывания кода режима ядра. Список центров сертификации, предоставляющих сертификаты публикации программного обеспечения (или сертификаты подписи кода), которые можно использовать для подписывания кода в режиме ядра, доступен на веб-странице Подписывание кода в режиме ядра Майкрософт для Windows Vista .
  2. Скачайте соответствующий кросс-сертификат с веб-страницы Подписывания кода в режиме ядра (Майкрософт) для корневого центра сертификации, выдавшего SPC. Перекрестный сертификат используется в цифровой подписи для кода режима ядра, чтобы ее можно было проверить до доверенного корневого центра, известного ядру Windows Vista.

При запросе сертификата публикации программного обеспечения из коммерческого ЦС следуйте инструкциям на веб-сайте центра сертификации, чтобы получить и установить сертификат подписи кода на компьютере, где вы будете использовать закрытый ключ для подписи кода.

Руководство по защите ключей подписывания кода

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

Подробные сведения о безопасной защиты закрытых ключей см. в статье Рекомендации по подписи кода.

Использование кросс-сертификатов с подписыванием кода в режиме ядра

В процессе подписывания кода в режиме ядра используются кросс-сертификаты. Перекрестный сертификат — это сертификат X.509, выданный одним центром сертификации (ЦС), который подписывает открытый ключ для корневого сертификата другого центра сертификации. Загрузчик операционной системы Windows Vista и ядро распознают перекрестные сертификаты при проверке подписей драйверов. Перекрестные сертификаты позволяют ядру иметь один доверенный корневой центр Майкрософт, но также обеспечивают гибкость для расширения цепочки доверия на несколько коммерческих ЦС, которые выдают сертификаты издателя программного обеспечения.

Перекрестные сертификаты позволяют разработчикам и издателям использовать сертификаты издателя программного обеспечения для подписывания программного обеспечения в режиме ядра. Разработчики, использующие подписывание кода в режиме ядра, скачают правильный файл с перекрестным сертификатом (CER) в систему, в которой выполняется операция цифровой подписи. Издателям не нужно распространять файл кросс-сертификата вместе с пакетом программного обеспечения или драйвера. Перекрестный сертификат будет включен в цифровую подпись в файле образа драйвера или каталоге пакетов драйверов. Пользователям, устанавливающим пакет драйверов, не придется выполнять какие-либо действия по настройке Windows Vista, чтобы проверить цифровую подпись, включающую перекрестный сертификат.

Важно SignTool в Windows Vista Beta2 WDK является единственной версией SignTool, которая в настоящее время поддерживает добавление перекрестных сертификатов в цифровую подпись. Предыдущие версии SignTool в пакете SDK для платформы Windows Server 2003 или DDK не поддерживают добавление кросс-сертификатов.

Перекрестные сертификаты для нескольких ЦС для подписывания кода в режиме ядра можно скачать на веб-сайте Microsoft WHDC. Дополнительные сведения см. в разделе Перекрестные сертификаты Майкрософт для подписывания кода в режиме ядра Windows Vista в разделе Ресурсы в конце этого документа.

Сведения о том, как добавить перекрестный сертификат в цифровую подпись, описаны в разделах Как подписать CAT-файл и Добавление внедренной подписи в файл образа драйвера.

Создание тестовых сертификатов

Тестовые сертификаты используются вместо spC для программных модулей режима тестирования подписывания ядра, которые не предназначены для распространения или выпуска за пределами организации. Тестовое подписывание — это применение цифровой подписи к двоичным файлам режима ядра или каталогам пакетов драйверов, используемым для внутреннего тестирования. Тестовое подписывание более подробно рассматривается в разделе Использование тестовой подписи далее в этом документе. При использовании тестового сертификата для подписывания кода в режиме ядра перекрестный сертификат не требуется.

Тестовые сертификаты можно создать с помощью корпоративного ЦС или служебной программы Makecert. Дополнительные сведения об использовании корпоративного ЦС для выдачи сертификатов тестовой подписи в организации см. в статье Рекомендации по подписи кода.

В следующем примере Makecert создает тестовый сертификат, выданный корнем теста по умолчанию, сохраняет закрытый ключ в контейнере ключей и выводит сертификат в хранилище сертификатов и файл сертификата:

Makecert –r –pe –ss SubjectCertStoreName –n "CN= CertName" OutputFile.cer

Аргументы Makecert в примере выполняют следующие действия:

  • -r
    Создает самозаверяющий сертификат, то есть сертификат является корневым.
  • -Pe
    Делает закрытый ключ, связанный с сертификатом, экспортируемым.
  • -ssSubjectCertStoreName
    Указывает имя хранилища сертификатов, содержащего корневой сертификат.
  • **-n "CN=**CertName"
    Указывает имя сертификата. Если имя сертификата не указано, по умолчанию для сертификата используется имя "Joe's Software Emporium".
  • OutputFile.cer
    Имя файла, в котором сохраняется корневой сертификат.

Пример скрипта команды, использующий makecert, доступен в WDK. Имя файла скрипта selfsign_example.txt находится в каталоге bin\selfsign. Перед установкой пакета драйверов необходимо добавить тестовые сертификаты в хранилище сертификатов на целевом тестовом компьютере.

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

certmgr.exe -add OutputFile.cer -s -r localMachine root 
certmgr.exe -add OutputFile.cer -s -r localMachine trustedpublisher

Аргументы Certmgr в примере выполняют следующие действия:

  • -Добавить
    Добавляет сертификат в файл сертификата в хранилище сертификатов.
  • -s
    Указывает, что хранилище сертификатов является системным хранилищем.
  • -r
    Указывает, что системное хранилище находится в HKEY_LOCAL_MACHINE разделе.
  • Root или trustedpublisher
    Указывает имя системного хранилища сертификатов.

Дополнительные сведения о Certmgr и Makecert см. в разделе Ресурсы в конце этой статьи.

Создание подписанного CAT-файла

Средства, используемые для создания и подписывания файлов каталога, MakeCat и SignTool, предоставляются в Windows Vista WDK.

Обратите внимание Signtool.exe и MakeCat.exe находятся в каталоге "bin\selfsign" WDK.

Создание CAT-файла

CAT-файл с цифровой подписью содержит хэши всех модулей режима ядра, которые проверяются при загрузке в ядро. Файл каталога также может включать хэши для других файлов в пакете программного обеспечения, таких как программы приложения в пользовательском режиме (.exes) и расширения приложений (DLLS). Корпорация Майкрософт рекомендует, чтобы CAT-файл содержал хэши всех файлов в пакете программного обеспечения.

CAT-файл содержит список хэшей файлов, соответствующих указанному набору файлов. Хэш файла — это результат хэша SHA1 для целевого файла. Неструктурированный хэш файла не используется для файлов, таких как драйверы, которые используют формат переносимых исполняемых файлов (PE). Вместо этого выборочно хэшируются соответствующие разделы, такие как заголовок PE, исполняемые данные и атрибуты, прошедшие проверку подлинности.

Когда драйвер загружается в память, ядро Windows Vista выполняет хэш SHA1 для соответствующих разделов файла двоичного образа драйвера. Windows проверяет, не был ли изменен файл, сравнивая полученное хэш-значение со списком двоичных хэшей в связанном CAT-файле.

При установке драйвера с INF-файлом с помощью Plug and Play используйте средство подписывания из WDK, чтобы создать каталог, как описано ниже. В противном случае вручную создайте каталог, как описано в разделе Создание каталога вручную далее в этом документе.

Создание каталога с помощью функции подписи

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

Создание каталога с помощью функции подписи

  1. Создайте каталог пакета драйверов, содержащий все файлы в пакете драйверов.
  2. Создайте INF-файл в каталоге пакета драйверов и измените его для Windows Vista. В частности, измените дату сборки на 01.04.2006 или более поздней, а версию — на 6. Например: DriverVer=04/01/2006, 6.0.1.0
  3. Запустите Signability, чтобы создать допустимый CAT-файл на основе INF-файла:
    • Запустите Signability.exe и создайте файл каталога с помощью графического интерфейса пользователя.

    • Запустите Signability из командной строки. Обратите внимание package_directory должен быть полным путем к каталогу пакета.

      Signability.exe /auto /cat /driver:package_directory /os:512
      

В этом примере создается CAT-файл в каталоге driver_package с использованием нескольких аргументов, поддерживаемых Signability:

  • /Авто
    Настраивает средство signability для запуска без необходимости взаимодействия с пользователем.
  • /Кошка
    Настраивает средство signability для создания файла каталога, имя которого предоставляется INF-файлом пакета драйверов.
  • /driver:DriverPath
    Предоставляет путь к каталогу, который содержит файлы пакета драйверов.
  • /os:nnn
    Настраивает средство подписи, чтобы убедиться, что INF-файл пакета драйвера соответствует требованиям версий Windows, заданных значением флага nnn. 512 — это значение для 64-разрядной версии Windows Vista.

Создание каталога вручную

Чтобы вручную создать CAT-файл, сначала используйте текстовый редактор для создания файла определения каталога (CDF). CDF-файл содержит список файлов, которые необходимо каталогизировать, и их атрибуты.

В следующем примере показано содержимое типичного CDF-файла с именем Good.cdf. Пакет для каталогизации содержит два файла: File1 и File2. Полученный CAT-файл называется Good.cat.

[CatalogHeader]
Name=Good.cat
PublicVersion=0x0000001
EncodingType=0x00010001
CATATTR1=0x10010001:OSAttr:2:6.0
[CatalogFiles]
<hash>File1=File1
<hash>File2=File2

CAT-файл создается с помощью программы командной строки MakeCat, которая входит в состав пакета SDK для платформы и WDK. Средство MakeCat:

  • Проверяет список атрибутов для каждого из перечисленных файлов.
  • Добавляет перечисленные атрибуты в CAT-файл.
  • Хэширует каждый из перечисленных файлов.
  • Сохраняет хэши каждого файла в CAT-файле.

Создание CAT-файла

  1. Используйте текстовый редактор, чтобы создать CDF-файл, содержащий список файлов для каталогизации с их атрибутами.
  2. Запустите MakeCat для CDF-файла.

Примечание MakeCat не изменяет CDF-файл.

В следующем примере показано, как создать CAT-файл из Good.cdf. Флаг -v указывает подробную версию MakeCat. Хэшированные файлы и вновь созданные Good.cat файлы помещаются в одну папку с файлами File1 и File2.

MakeCat -v Good.cdf

CAT-файл теперь готов к подписанию.

Дополнительные сведения о MakeCat и формате CDF-файлов см. в документации по MakeCat, указанной в разделе Ресурсы в конце этой статьи.

Как подписать CAT-файл

Cat-файл, созданный MakeCat, содержит все хэши файлов, необходимые для установки модулей режима ядра в системе пользователя. Однако файл также должен быть подписан цифровой подписью.

CAT-файл подписывается с помощью программы командной строки SignTool. Цифровая подпись каталога, которая используется для проверки файлов изображений в режиме ядра, должна содержать перекрестный сертификат. Перекрестный сертификат добавляется с помощью нового параметра команды в SignTool.

Важно Чтобы добавить перекрестный сертификат в цифровую подпись, необходимо использовать версию SignTool из Windows Vista Beta2 WDK.

В следующем примере показано, как использовать Signtool для подписи CAT-файла с помощью SPC и соответствующего закрытого ключа, импортированного в хранилище сертификатов Windows. Сведения об использовании Signtool с HSM см. в документации по SignTool, указанной в разделе Ресурсы в конце этого документа.

SignTool sign /v /ac CrossCertificateFile /s SPCCertificateStore /n SPCSubjectName /t http://timestamp.verisign.com/scripts/timestamp.dll Good.cat

В этом примере используется несколько аргументов, поддерживаемых SignTool:

  • Подпись
    Настраивает средство для подписывания CAT-файла с именем CatFileName.cat.
  • /v
    Указывает подробный параметр для успешного выполнения и предупреждающих сообщений*.*
  • /Ac
    Добавляет перекрестный сертификат из файла CrossCertificateFile в цифровую подпись.
  • /s
    Указывает хранилище сертификатов с именем SPCCertificateStore.
  • /N
    Указывает сертификат с именем субъекта SPCSubjectName.
  • URL-адрес/t
    Указывает, что цифровая подпись будет иметь метку времени с помощью центра метки времени (TSA), указанного URL-адресом.

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

Если во время установки устройства истек срок действия SPC, который использовался для подписывания, и подпись не была метка времени, CAT-файл не устанавливается и Windows не разрешает загрузку драйвера. Однако если подпись имеет метку времени с помощью доверенного центра метки времени, устанавливается CAT-файл, и Windows позволяет загрузить драйвер.

Подписывание самовоспаковывляющегося файла загрузки

Программное обеспечение, опубликованное для распространения на веб-сайте поддержки продукта, обычно упаковано в самораспаковывляющийся архивный файл. Самоиспакованный исполняемый файл загружается с помощью веб-браузера, а содержимое извлекается до того, как пользователь начнет установку на своем компьютере. Используйте SPC, подписав cat-файл пакета драйвера, чтобы также цифровой подписью самовоспаковывляющегося файла .exe.

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

В Windows Vista, если пользователь просматривает сведения в диалоговом окне "Предупреждение системы безопасности" и выбирает "Всегда устанавливать программное обеспечение с <имени> издателя", этот параметр упростит последующее подтверждение при установке пакета драйверов. После установки пакета драйверов пользователю будет предложено доверять издателю подписанного пакета драйверов до начала установки драйвера. Если пользователь выбрал параметр всегда устанавливать программное обеспечение от издателя драйверов при скачивании самостоятельно извлекаемого .exe файла, диалоговое окно доверия во время установки драйвера не будет появляться.

Установка подписанного CAT-файла

Для драйверов, устанавливаемых через Plug and Play, никаких изменений в процессе установки не ожидается. Установка встроенного драйвера со знаком не требует специальной обработки за пределами стандартных механизмов INF и настройки. Обратите внимание, что устанавливать пакеты драйверов могут только пользователи, являющиеся членами группы "Администраторы".

Драйверы, которые не устанавливаются через Plug and Play, должны устанавливать свои CAT-файлы в корневой папке системного каталога. Установкой каталога в корневой папке каталога можно управлять с помощью существующих вызовов API каталога Win32, в частности CryptCATAdminAddCatalog.

Добавление внедренной подписи в файл образа драйвера

Чтобы оптимизировать производительность проверки драйвера во время загрузки, двоичные файлы драйвера загрузки и запуска должны иметь внедренную сигнатуру с использованием SPC в дополнение к подписанному CAT-файлу для пакета. Внедренная сигнатура значительно экономит время при загрузке операционной системы, так как загрузчику операционной системы не нужно находить CAT-файл в драйвере. Типичная система Windows Vista может содержать более ста различных файлов каталога в корневом хранилище каталога. Поиск правильного файла каталога для проверки хэша образа определенного драйвера может привести к большим затратам системы на поиск нужного файла в нескольких каталогах.

Драйверы запуска загрузки определяются на основе значения startType службы SERVICE_BOOT_START (0).

Внедренные сигнатуры не влияют на подписывание или проверку CAT-файла. Обратите внимание, что хэши, содержащиеся в каталогах и внедренных подписях, выборочно исключают часть подписи в формате PE-файла.

Чтобы использовать Signtool.exe для внедрения подписи в двоичный файл драйвера загрузки и запуска с помощью SPC и соответствующего закрытого ключа, импортированного в хранилище сертификатов Windows, используйте следующую команду:

SignTool sign /v /ac CrossCertificateFile /s SPCCertificateStore /n SPCSubjectName /t http://timestamp.verisign.com/scripts/timestamp.dll winloaddriver.sys

В этом примере используется несколько аргументов, поддерживаемых SignTool:

  • Подпись
    Команда sign настраивает средство для подписывания драйвера с именемwinloaddriver.sys.
  • /v
    Указывает подробный параметр для успешного выполнения и предупреждающих сообщений*.*
  • /Ac
    Добавляет перекрестный сертификат из файла CrossCertificateFile в цифровую подпись.
  • Параметры/s
    Указывает хранилище сертификатов с именем SPCCertificateStore.
  • /N
    Указывает сертификат с именем субъекта SPCSubjectName.
  • URL-адрес/t
    Указывает, что цифровая подпись должна быть помечена меткой времени TSA, которая обозначается URL-адресом.

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

Проверка внедренной подписи

В следующей процедуре показано, как проверить внедренную сигнатуру с помощью Windows Обозреватель.

Проверка внедренных подписей

  1. При запуске Windows Vista щелкните правой кнопкой мыши файл драйвера .sys и выберите пункт Свойства в контекстном меню.
  2. Щелкните вкладку Цифровые подписи , если она присутствует.
    • Если эта вкладка отсутствует, файл не имеет встроенной сигнатуры.
  3. Выберите подписывателя и щелкните Сведения , чтобы открыть диалоговое окно Сведения о подписи .
  4. Щелкните Просмотреть сертификат , чтобы открыть страницы свойств сертификата.
    • Убедитесь, что диалоговые окна с предупреждениями отсутствуют.
    • Убедитесь, что имя субъекта сертификатов — Publisher зарегистрировано в распознаваемом центре сертификации.
  5. Перейдите на вкладку Путь сертификации .
    • Убедитесь, что имя субъекта верхнего сертификата — Microsoft Code Verification Root.

Проверка внедренных подписей с помощью signtool.exe для политики подписывания кода в режиме ядра

  • Signtool.exe можно использовать для проверки подписи в CAT-файле с помощью следующей команды:
Signtool verify /kp /c tstamd64.cat toaster.sys

Убедитесь, что хэш изображения для toaster.sys файла находится в файле каталога. Средство возвращает строку "Success".

Отключение принудительного применения подписей во время разработки

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

  • Присоединение отладчика ядра. Присоединение активного отладчика ядра к целевому компьютеру отключает принудительное применение подписей режима ядра в Windows Vista и позволяет загружать драйвер.

  • Использование параметра F8. Расширенный параметр загрузки F8, появившись в Windows Vista— "Отключить принудительное применение подписи драйвера", доступен для отключения принудительного применения подписывания ядра только для текущего сеанса загрузки. Этот параметр не сохраняется в сеансах загрузки.

  • Настройка конфигурации загрузки. В бета-версии Windows Vista доступен параметр конфигурации загрузки, который отключает принудительное применение сигнатур режима ядра для сохранения в сеансах загрузки.

    Windows Vista включает программу командной строки BCDedit, с помощью которой можно задать параметр в Windows Vista Beta2 для отключения проверок подписей. Чтобы использовать BCDedit, пользователь должен быть членом группы администраторов в системе и выполнить команду из командной строки с повышенными привилегиями. Командную строку с повышенными привилегиями можно запустить, создав ярлык на рабочем столе для cmd.exe, а затем щелкнув правой кнопкой мыши и "Запуск от имени администратора".

    Ниже показан пример запуска BDCedit в командной строке:

    // Disable enforcement – no signing checks
    Bcdedit.exe –set nointegritychecks ON 
    
    // Enable enforcement – signing checks apply
    Bcdedit.exe –set nointegritychecks OFF 
    
    // Disabling integrity check on an alternate OS 
    // specified by a GUID for the system ID
    Bcdedit.exe –set {4518fd64-05f1-11da-b13e-00306e386aee} nointegritychecks ON 
    

Примечание Параметр Bcdedit для отключения проверок целостности доступен только для загрузки неподписанных драйверов в выпуске Windows Vista Beta2. Дополнительные сведения см. в разделе Часто задаваемые вопросы о редакторе BCD на веб-сайте MSDN.

Как использовать тестовое подписывание

Тестовое подписывание предоставляет организациям разработки дополнительные возможности для включения подписывания кода в режиме ядра для предварительного выпуска программного обеспечения, которое не готово к публикации. Тестовое подписывание позволяет использовать сертификаты подписи "тестового" кода для подписывания драйверов, которые будут загружаться в Windows Vista, когда параметр конфигурации загрузки Windows Vista разрешает тестовые подписи.

Тестовое подписывание может быть целесообразно использовать в следующих сценариях:

  • Командам разработчиков необходимо тестировать предварительные версии драйвера в тестовых системах, где нецелесообразно подключать отладчик ядра.
  • Автоматическое тестирование программного обеспечения в режиме ядра делает нецелесообразным использовать функцию F8 Advanced Boot Option для временного отключения принудительного применения подписи драйвера на каждом цикле загрузки компьютера.

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

  • Сертификаты, используемые для подписывания тестов, могут быть созданы с помощью средства подписывания кода Makecert.exe или выданы корпоративным ЦС вместо SPC, выданного коммерческим ЦС.
  • Параметр конфигурации загрузки Windows Vista для включения подписывания тестов должен быть включен в системе Windows Vista, которая будет загружать драйвер, подписанный тестом.

Организации разработки могут настроить корпоративную PKI и выдавать собственные сертификаты подписи тестового кода для использования для подписывания тестов. Когда Windows Vista включает тестовую подпись, проверка цифровой подписи в двоичном файле драйвера будет принимать сертификаты, выданные любым центром сертификации или центром выдачи. Тестовое подписывание проверяет, что образ драйвера подписан, но проверка пути к сертификату, выполняемая в режиме ядра, не требует настройки издателя в качестве доверенного корневого центра. Это позволяет организациям использовать отдельные подписи в тестовых двоичных файлах на основе учетных данных, выданных для подписывания кода в организации. Корпорация Майкрософт рекомендует использовать эту форму развертывания для тестовой подписи кода в режиме ядра.

Использование сертификатов, созданных средством makecert.exe, также допустимо для тестового подписывания. Однако сертификаты, созданные makecert, часто не предоставляют полезные сведения об удостоверениях, и невозможно отследить, какой отдельный разработчик создал тестовую подписанную версию двоичного файла предварительного выпуска.

Примечание Бета-версия Windows Vista 2 принимает только тестовые сертификаты, созданные средством makecert. Сертификаты подписи тестового кода, выданные корпоративным ЦС для тестовой подписи, недоступны в Windows Vista Beta2.

Инструкции Signtool в этом документе работают так же, как при использовании SPC или сертификата, созданного программой makecert, или сертификата, выданного корпоративным ЦС. Единственное различие обычно заключается в имени издателя и субъекта в сертификате.

Программа WHQL Test Signature также поддерживается для подписывания тестов. Участники программы могут отправлять пакеты драйверов для подписей тестов WHQL. Подпись в тестовых подписанных каталогах создается сертификатом, выданным корневым центром Microsoft Test. Корневой центр тестирования Майкрософт по умолчанию принимается в Бета-версии Windows Vista 2 в рамках бета-версии программы. В окончательном выпуске Windows Vista корневой центр тестирования Microsoft принимается, когда параметр конфигурации загрузки Windows Vista включает подписывание тестов.

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

Включение подписывания тестов

Используйте программу командной строки Bcdedit, чтобы включить тестовое подписывание. Чтобы использовать BCDedit, пользователь должен быть членом группы администраторов в системе и выполнить команду из командной строки с повышенными привилегиями. Командную строку с повышенными привилегиями можно запустить, создав ярлык на рабочем столе для cmd.exe, а затем щелкнув правой кнопкой мыши и "Запуск от имени администратора".

Ниже показан пример запуска BDCedit в командной строке:

// Accept test signed kernel mode signatures
Bcdedit.exe –set TESTSIGNING ON 

// Do not accept test signed kernel mode signatures
Bcdedit.exe –set TESTSIGNING OFF 

Параметр TESTSIGNING конфигурации загрузки определяет, принимает ли Windows Vista двоичные файлы в режиме тестовой подписи ядра. Параметр не определен по умолчанию, что означает, что цифровые подписи в драйверах тестового режима ядра не будут проверяться и не будут загружаться. Когда Windows Vista принимает двоичные файлы режима тестовой подписи ядра, некоторые защищенные премиум-содержимое могут быть недоступны в системе.

Устранение неполадок

Для выявления и устранения потенциальных проблем, связанных с проверкой подписей кода в режиме ядра, можно предпринять определенные действия. В этом разделе содержатся сведения об устранении неполадок с применением подписывания драйверов. Ниже перечислены main средства для устранения неполадок подписывания драйверов.

  • Обнаружение ошибок загрузки драйверов
  • Включение событий системного журнала диагностики целостности кода.

В качестве примера используется приложение тостера, включенное в Windows Vista WDK. Приложение тостера можно найти в WDK в каталоге "src\general\тостер".

Обнаружение ошибок загрузки драйверов

Приложение тостера устанавливает драйвер устройства (toaster.sys), который в этом примере не подписан. Симптом проблемы с неподписанным драйвером заключается в том, что устройство тостера не запускается. С помощью диспетчер устройств можно проверка состояние устройства Тостер и просмотреть состояние драйвера, как показано на следующем изображении экрана.

Bb530195.digitalsigskernmodules01(en-us,MSDN.10).gif

Рис. 1. Ошибка неподписаного драйвера

Не удалось запустить устройство, так как драйвер устройства не был подписан, а принудительное применение подписывания в режиме ядра заблокировало загрузку драйвера в ядро. Чтобы окончательно определить источник проблемы, мы настроили систему для включения принудительного применения подписывания диагностика, как описано ниже.

Включение событий системного журнала диагностики целостности кода

Принудительное применение подписывания кода в режиме ядра реализуется компонентом Windows Vista, известным как целостность кода. Целостность кода создает диагностические события и событие журнала аудита системы, если сигнатуру модуля ядра не удается проверить правильно.

  • Операционные события целостности кода всегда включены. Операционные события — это события предупреждения, когда проверка проверки образа при загрузке двоичного файла в режиме ядра.
  • События аудита системы целостности кода создаются при включении политики аудита системы. Политика аудита системы не включена по умолчанию.
  • Подробные события целостности кода — это аналитические и отладочные информационные события, которые показывают все успешные проверки изображения при загрузке двоичных файлов в режиме ядра. Подробные события не включены по умолчанию.

События целостности кода можно просмотреть в Просмотр событий, которая является частью оснастки MMC управления компьютером. (На кнопке Пуск щелкните правой кнопкой мыши компьютер и выберите Управление).

Поток событий целостности кода находится в следующей иерархии:

Просмотр событий -> Журналы приложений и служб —> Microsoft —> Windows —> CodeIntegrity

Bb530195.digitalsigskernmodules02(en-us,MSDN.10).gif

Рис. 2. События целостности кода

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

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

Запись операционного журнала для неподписанных или измененных ошибок проверки образа драйвера выглядит следующим образом:

Bb530195.digitalsigskernmodules03(en-us,MSDN.10).gif

Рис. 3. Запись журнала операций

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

События журнала аудита системы

Целостность кода создает события журнала аудита системы, соответствующие событиям операционных предупреждений при сбое проверки образа драйвера режима ядра. События системного журнала можно просмотреть в Просмотр событий в представлении системного журнала Windows Logs ( Журналы Windows).

События аудита системы могут быть включены не во всех системах Windows Vista. Используйте оснастку MMC "Локальные параметры безопасности", чтобы проверить или включить "Аудит системных событий" в параметрах Локальные политики, Политика аудита.

Информационные события в подробном журнале

В представлении подробных событий доступны дополнительные информационные события целостности кода для всех проверок изображений в режиме ядра. Эти события показывают успешную проверку образа всех драйверов, загруженных в систему.

Ниже приведены шаги по включению представления подробных событий целостности кода.

  1. Щелкните левой кнопкой мыши операционное представление, чтобы отобразить текущие события целостности кода (если таковые есть).
  2. Щелкните левой кнопкой мыши узел Целостность кода , чтобы установить фокус.
  3. Щелкните правой кнопкой мыши узел Целостность кода , чтобы открыть контекстное меню.
  4. Выберите Вид.
  5. Выберите Показать журналы аналитики и отладки.
  6. При этом создается вложенное дерево с двумя дополнительными узлами: операционным и подробным .
  7. Щелкните правой кнопкой мыши узел Подробно и выберите Свойства.
  8. Выберите лист Общие и выберите параметр Включитьведение журнала . Это должно включить режим подробного ведения журнала.
  9. Перезагрузите систему, чтобы перезагрузить все двоичные файлы режима ядра.
  10. После перезагрузки откройте оснастку "Управление компьютером" и просмотрите журналсобытийцелостностикодаПодробно.

Если toaster.sys правильно подписан, можно проверка следующим образом:

В этом конкретном случае toaster.sys является драйвером PnP и именуется в файле каталога (tstamd64.cat в папке \src\general\тостер\toastpkg\toastcd). Используйте служебную программу SignTool, чтобы проверить, правильно ли подписан каталог toaster.sys, с помощью следующей команды:

Signtool verify /kp /c tstamd64.cat toaster.sys

Параметры отладки проверки драйвера

В некоторых случаях разработчикам может потребоваться принудительно применять политику подписывания кода в режиме ядра даже при присоединении отладчика. Например, стек драйверов содержит неподписанный драйвер (например, драйвер фильтра), который не загружается, что может сделать весь стек недействительным. Так как присоединение отладчика позволяет загрузить неподписанный драйвер, проблема исчезает сразу после подключения отладчика. Отладка этого типа проблемы может быть сложной. Чтобы упростить отладку в этом случае, целостность кода поддерживает раздел реестра, который можно задать для принудительного применения подписывания режима ядра даже при присоединении отладчика.

В реестре определены два флага, которые управляют поведением целостности кода в отладчике. Флаги не определены по умолчанию.

Создайте значение реестра следующим образом:

Key:   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI
Value:   DebugFlags      REG_DWORD   

Возможные значения:

  • 00000001
    Приводит к разрыву отладки в отладчике, и неподписанный драйвер может загружаться с g.
  • 00000010
    CI игнорирует наличие отладчика, а неподписанные драйверы не будут загружаться.

Любое другое значение приводит к загрузке неподписанных драйверов — это политика по умолчанию.

Сообщения журнала событий целостности кода

Ниже приведены события предупреждений, зарегистрированные в операционном журнале целостности кода.

  • "Целостность кода не может проверить целостность образа имени> файла, <так как не удалось найти хэш файла в системе".
  • "Целостность кода обнаружил неподписанный драйвер".
  • "Это событие связано с мониторингом качества программного обеспечения (SQM)".

Ниже приведены события сведений, зарегистрированные в подробном журнале целостности кода.

  • "Целостность кода обнаружила набор хэшей изображений для каждой страницы для имени > файла < в имени> каталога каталога<".
  • "Целостность кода обнаружила набор хэшей изображений для каждой страницы для имени > файла < во внедренном сертификате образа".
  • "Целостность кода обнаружила хэш файла для имени> файла < в имени> каталога каталога<".
  • "Целостность кода обнаружила хэш файла для имени> файла < во внедренном сертификате образа".
  • "Целостность кода определила, что неподписанный файл> модуля < ядра загружается в систему. Обратитесь к издателю, чтобы узнать, доступна ли подписанная версия модуля ядра".
  • "Целостности кода не удается проверить целостность образа имени> файла, < так как не удалось найти в системе набор хэшей изображений для каждой страницы".
  • "Целостность кода не может проверить целостность образа имени> файла, < так как не удалось найти в системе набор хэшей изображений для каждой страницы. Образ можно загрузить, так как подключен отладчик режима ядра".
  • "Целостность кода не может проверить целостность образа имени> файла, < так как не удалось найти хэш файла в системе. Образ можно загрузить, так как подключен отладчик режима ядра".
  • "Целостности кода не удалось загрузить < каталог имен> файлов".
  • "Целостность кода успешно загружен каталог <имен> файлов".

Ресурсы