Тестовое подписывание

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

Установка драйвера без знака во время разработки и тестирования

Выдержка изстатьи Установка неподписаного драйвера во время разработки и тестирования:

По умолчанию 64-разрядные версии Windows Vista и более поздние версии Windows загружают драйвер в режиме ядра только в том случае, если ядро может проверить подпись драйвера. Однако это поведение по умолчанию может быть отключено во время ранней разработки драйвера и для неавтоматочного тестирования. Разработчики могут использовать один из следующих механизмов, чтобы временно отключить принудительное применение допустимой сигнатуры драйвера во время загрузки. Однако для полной автоматизации тестирования драйвера, установленного Plug and Play (PnP), необходимо подписать файл каталога драйвера. Подписывание драйвера требуется, так как в Windows Vista и более поздних версиях Windows отображается диалоговое окно подписывания драйвера для неподписанных драйверов, которые требуют от системного администратора авторизации установки драйвера, что может помешать любому пользователю без необходимых привилегий установить драйвер и использовать устройство. Это поведение установки драйвера PnP нельзя отключить в Windows Vista и более поздних версиях Windows.

Использование параметра расширенной загрузки F8

Windows Vista и более поздние версии Windows поддерживают функцию F8 Advanced Boot Option ( Отключить принудительное применение подписи драйвера), которая отключает принудительное применение подписи во время загрузки для драйвера режима ядра только для текущего системного сеанса. Этот параметр не сохраняется при перезапуске системы.

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

снимок экрана, показывающий расширенные параметры загрузки f8.

Присоединение отладчика ядра для отключения проверки подписи

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

bcdedit -debug on

Чтобы использовать BCDEdit, пользователь должен быть членом группы администраторов в системе и выполнить команду из командной строки с повышенными привилегиями. Чтобы открыть окно командной строки с повышенными привилегиями, создайте ярлык на рабочем столе, чтобы Cmd.exe, выберите и удерживайте (или щелкните правой кнопкой мыши) ярлык, а затем выберите Запуск от имени администратора.

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

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

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

Выдержка израздела Как Test-Sign пакета драйвера:

Компьютер подписывания

Это компьютер, используемый для проверки и подписывания пакета драйверов для Windows Vista и более поздних версий Windows. Этот компьютер должен работать под управлением Windows XP с пакетом обновления 2 (SP2) или более поздних версий Windows. Чтобы использовать средства подписывания драйверов, на этом компьютере должны быть установлены Windows Vista и более поздние версии пакета драйверов Windows (WDK). Это также может быть компьютер разработки.

Тестовый компьютер

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

Процедура подписывания тестов

Пакеты драйверов будут содержать двоичный файл драйвера, INF-файл, CAT-файл и любые другие необходимые файлы. Пакет драйверов может содержать подкаталоги, такие как x86, AMD64, IA64, если драйвер создан для нескольких целевых типов процессоров. Выполните эти действия с помощью компьютера разработки или подписывания.

В следующей процедуре описаны шаги по проверке подписи пакета драйвера.

  1. Создайте драйвер для целевого объекта. Если вы создаете драйвер для Windows 8.0 или Windows 8.1, используйте Visual Studio 2012 или Visual Studio 2013 с соответствующим установленным WDK, например Windows 8.0 или 8.1 WDK соответственно.

    Все описанные ниже командные средства следует использовать из соответствующего командного окна visual Studio 2012 или Visual Studio 2013.

    Примечание

    Командные средства для Visual Studio находятся в каталоге установки C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts

    Любой из пяти сочетаний клавиш для командной строки будет содержать команды makecert.exe, inf2cat.exe, signtool.exe, certmgr.exe и т. д.

    Вы можете выбрать наиболее общий вариант — "Командная строка разработчика для VS2013". Сочетания клавиш можно закрепить на панели задач, чтобы упростить доступ.

    Примечание

    Обратите внимание, что в Visual Studio вместо того, чтобы использовать командную программу подписывания драйверов, вы также можете использовать среду разработки Visual Studio 2013 (также называемую интегрированной средой разработки) для подписания пакета драйверов. Дополнительные сведения см. в приложении 2. Подписывание драйверов с помощью Visual Studio .

  2. Создайте папку пакета драйверов и скопируйте файлы драйверов, поддерживая все необходимые вложенные каталоги, например C:\DriverTestPackage.

  3. Создайте INF-файл для пакета драйвера. Протестируйте INF-файл с помощью средства InfVerif из WDK в INF-файле, чтобы не сообщалось об ошибке.

  4. Выдержка израздела Создание тестовых сертификатов:

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

    • Создайте самозаверяющий тестовый сертификат с именем Contoso.com(Test). Этот сертификат использует то же имя для имени субъекта и центра сертификации (ЦС).

    • Поместите копию сертификата в выходной файл с именем ContosoTest.cer.

    • Поместите копию сертификата в хранилище сертификатов с именем PrivateCertStore. Если поместить тестовый сертификат в PrivateCertStore , он будет отделен от других сертификатов, которые могут находиться в системе.

    Используйте следующую команду MakeCert, чтобы создать сертификат Contoso.com(Test):

    makecert -r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) ContosoTest.cer
    

    Где:

    • Параметр -r создает самозаверяющий сертификат с тем же именем издателя и субъекта.

    • Параметр -pe указывает, что закрытый ключ, связанный с сертификатом, можно экспортировать.

    • Параметр -ss указывает имя хранилища сертификатов, содержащего тестовый сертификат (PrivateCertStore).

    • Параметр -n CN= указывает имя сертификата, Contoso.com(Test). Это имя используется вместе со средством SignTool для идентификации сертификата.

    • ContosoTest.cer — это имя файла, содержащего копию тестового сертификата, Contoso.com(Test). Файл сертификата используется для добавления сертификата в хранилище сертификатов доверенных корневых центров сертификации и в хранилище сертификатов доверенных издателей.

    Выдержка израздела Просмотр сертификатов теста:

    После создания сертификата и его копирования в хранилище сертификатов можно использовать оснастку сертификатов консоли управления (MMC) для его просмотра. Чтобы просмотреть сертификат с помощью оснастки "Сертификаты MMC", сделайте следующее:

    1. Чтобы запустить оснастку "Сертификаты", запустите Certmgr.msc.

    2. В левой области оснастки "Сертификаты" разверните папку хранилища сертификатов PrivateCertStore и дважды щелкните Сертификаты.

    На следующем снимке экрана показана оснастка "Сертификаты" в папке хранилища сертификатов PrivateCertStore .

    Снимок экрана: хранилище сертификатов с тестируемым сертификатом .

    Чтобы просмотреть сведения о сертификате Contoso.com(Test), дважды щелкните сертификат в области справа. На следующем снимку экрана показаны сведения о сертификате.

    Снимок экрана: окно сертификата с общими сведениями о contoso.com (тестовом) сертификате.

    Обратите внимание, что в диалоговом окне Сертификат указано: "Этот корневой сертификат ЦС не является доверенным. Чтобы включить доверие, установите этот сертификат в хранилище доверенных корневых центров сертификации". Это ожидаемое поведение. Невозможно проверить сертификат, так как Windows по умолчанию не доверяет центру выдачи "Contoso.com(Test)".

  5. Создайте файл каталога (расширение CAT). Используйте средство inf2cat, как показано ниже, чтобы создать файл каталога. Обратите внимание, что для параметров не допускается свободное место, /driver:<no space><full path>, /os: :<no space><os1 name>,:<no space><os2 name>.

    inf2cat  /v  /driver:C:\DriverTestPackage  /os:7_64,7_x86 ,XP_X86
    

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

    /os:2000,XP_X86,XP_X64,Server2003_X64,Vista_X64,Vista_X86,7_x86,7_64,Server2008_x86,Server2008_x64,Sever2008_IA64,Server2008R2_x86,Server2008R2_x64,Server2008R2_IA64,8_x86,8_x64, 8_ARM, Server8_x64
    

    Обновленный inf2cat из новой версии 8.1 WDK содержит значения параметров /os 6_3_X86, 6_3_X64, 6_3_ARM и SERVER_6_3_X64.

    Пример INF-файла для раздела Версия.

    [Version]
    Signature="$WINDOWS NT$"
    Class=TOASTER
    ClassGuid={B85B7C50-6A01-11d2-B841-00C04FAD5171}
    Provider=%ToastRUs%
    DriverVer=09/21/2006,6.0.5736.1
    CatalogFile.NTx86 = tostx86.cat
    CatalogFile.NTIA64 = tostia64.cat
    CatalogFile.NTAMD64 = tstamd64.cat
    PnpLockdown = 1
    

    Параметр /driver (или /drv) указывает каталог, содержащий один или несколько INF-файлов. В этом каталоге создаются файлы каталога для файлов INF, содержащих одну или несколько директив CatalogFile. Имя файла каталога не ограничено именем 8.3.

    Inf2Cat создает файл каталога tstamd64.cat, если используется аргумент командной строки /os:7_X64. Аналогичным образом средство создает файл каталога toastx86.cat если для Server2008R2_IA64 используется параметр /os:XP_X86. В случае, если требуется только один файл каталога, то достаточно только одной записи в INF-файле, как показано ниже.

    CatalogFile.NT = toaster.cat
    

    Или

    CatalogFile = toaster.cat
    

    Если дата в INF-файле не больше даты выпуска ОС, средство inf2cat сообщит следующее сообщение об ошибке, если параметр /os был для Windows 7 и дата, заданная в INF-файле, была более ранней датой.

    Signability test failed.
    Errors:
    22.9.7: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in \toaster.inf
    

    Средство inf2cat очень строго проверяет наличие в каждой папке и вложенной папке каждого файла с записью в INF-файле. В таких отсутствующих записях появятся значимые сообщения об ошибках.

    Файл cat можно открыть в проводнике, дважды щелкнув файл или щелкнув его правой кнопкой мыши и выбрав Открыть. На вкладке Безопасность отображаются некоторые записи со значениями GUID. При выборе значения GUID отобразятся сведения, включая файлы драйверов пакета драйверов и добавленные ос, как показано ниже.

    OSAttr  2:5.1,6.1
    

    Номер 5.1 — это номер версии для ОС XP и 6.1 для ОС Windows 7.0.

    Рекомендуется проверить cat-файл, чтобы проверить включение файлов драйверов и выбранных ос. В любое время при добавлении или удалении какого-либо файла драйвера, INF-файл был изменен, cat-файл должен быть повторно создан и подписан повторно. Любое упущение в этом случае приведет к ошибкам установки, которые отображаются в файле журнала установки (setupapi.dev.log для Vista и выше или setupapi.log для XP).

  6. Выдержка изфайла каталога пакета драйверов с тестовой подписью:

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

    Чтобы проверить и подписать файл каталога tstamd64.cat , выполните следующую командную строку:

    signtool sign /v /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.digicert.com tstamd64.cat
    

    Где:

    • Команда sign настраивает SignTool для подписывания указанного файла каталога, tstamd64.cat.

    • Параметр /v включает подробные операции, в которых SignTool отображает сообщения об успешном выполнении и предупреждения.

    • Параметр /s указывает имя хранилища сертификатов (PrivateCertStore), содержащего тестовый сертификат.

    • Параметр /n указывает имя сертификата (Contoso.com(Test)), установленного в указанном хранилище сертификатов.

    • Параметр /t указывает URL-адрес TSA (http://timestamp.digicert.com), который будет меткой времени цифровой подписи.

    Важно!

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

  • tstamd64.cat указывает имя файла каталога, который будет иметь цифровую подпись.

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

  1. Изменен фрагмент израздела Test-Signing a Driver с помощью внедренной сигнатуры:

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

    Ниже приведена команда для внедрения подписывания двоичного файла драйвера в режиме ядра.

    signtool sign  /v  /s  PrivateCertStore  /n  Contoso.com(Test)  /t http://timestamp.digicert.com   amd64\toaster.sys
    

    amd64\toaster.sys указывает имя двоичного файла в режиме ядра, который будет подписан на основе внедрения.

    В каталоге установки WDK 7.1 образец тостера находится в каталоге src\general\тостер\toastpkg\toastcd\. Примеры WDK Windows 8 или 8.1 можно скачать с сайта загрузки Майкрософт. Примеры не входят в комплект драйверов windows Windows 8 или 8.1.

    При открытии файла каталога двойным щелчком файла в Windows Обозреватель вы увидите следующий снимок экрана. Обратите внимание, что теперь выделен элемент View Signature (Просмотр подписи).

    Снимок экрана: общие сведения о файле каталога безопасности.

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

    Снимок экрана: общие сведения о цифровой подписи.

    Снимок экрана: общие сведения о сертификате.

Теперь драйвер можно протестировать на компьютере подписывания или тестовом компьютере. Если вы используете тестовый компьютер, скопируйте пакет драйвера на компьютер, сохранив нетронутую структуру файлов. Средство certmgr.exe также необходимо скопировать на тестовый компьютер. При использовании тестового компьютера скопируйте подписанный тест пакет драйвера Toastpkg во временную папку c:\тостер.

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

  1. В командном окне с повышенными привилегиями выполните следующую команду:

    bcdedit  /set  testsigning  on
    

    Перезагрузите компьютер.

  2. Выбранные фрагменты израздела Использование CertMgr для установки тестовых сертификатов на тестовом компьютере:

    Скопируйте файл сертификата (CER-файл), который использовался для проверки и подписывания драйверов, на тестовый компьютер. Файл сертификата можно скопировать в любой каталог на тестовом компьютере.

    Следующая команда CertMgr добавляет сертификат в файл сертификата CertificateFileName.cer в хранилище сертификатов доверенных корневых центров сертификации на тестовом компьютере:

    CertMgr.exe /add CertificateFileName.cer /s /r localMachine root
    

    Следующая команда CertMgr добавляет сертификат в файл сертификата CertificateFileName.cer в хранилище сертификатов доверенных издателей на тестовом компьютере:

    CertMgr.exe /add CertificateFileName.cer /s /r localMachine trustedpublisher
    

    Где (выдержки изCertMgr):

    /add CertificateName

    Добавляет сертификат из указанного файла сертификата в хранилище сертификатов.

    /s

    Указывает, что хранилище сертификатов является системным хранилищем.

    /r RegistryLocation

    Указывает, что расположение системного хранилища в реестре находится в HKEY_LOCAL_MACHINE.

    CertificateStore

    Указывает хранилище сертификатов trustedpublisher аналогично для "localMachine root".

    Перезагрузите компьютер. Теперь можно запустить Certmgr.msc и убедиться, что ContosoTest.cer отображается в двух указанных выше расположениях. Если он не отображается, другой способ установить сертификат — открыть сертификат и установить его на двух указанных выше узлах и проверить его еще раз.

  3. Убедитесь, что подписывание cat-файла и sys-файла. Откройте командное окно с повышенными привилегиями и, если на компьютере доступна signtool.exe, перейдите в каталог пакета драйверов, в котором находятся файлы cat, inf и sys. Выполните следующие команды в соответствующем каталоге.

    Из раздела Проверка подписи SPC файла каталога:

    signtool  verify  /v  /kp  /c  tstamd64.cat  toaster.inf
    

    Чтобы проверка для знака внедрения, выполните следующую команду.

    Из раздела Проверка подписи файла драйвера Release-Signed:

    signtool  verify  /v  /kp  toaster.sys
    

    Две приведенные выше команды приведут к одной ошибке, так как она подписана тестом и сертификат не был доверенным сертификатом.

    SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
    

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

    Теперь драйвер готов к установке и тестированию на тестовом компьютере. Рекомендуется правильно задать следующий раздел реестра для сбора подробных журналов в файле setupapi.dev.log (для Операционных систем Windows Vista и более поздних версий) в процессе установки.

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\Loglevel=0x4800FFFF

    В файле %SystemRoot%\inf перед установкой драйвера переименуйте файл setupapi.dev.log. После установки будет создан новый файл журнала setupapi.dev.log, который будет содержать ценную информацию, обнаруженную во время установки.

    После успешной установки драйвер можно протестировать на компьютере разработки или на тестовом компьютере.

Установка, удаление и загрузка пакета драйвера Test-Signed

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

  1. С помощью предоставленного ОС средства Pnputil (pnputil.exe).

  2. С помощью средства Devcon (devcon.exe), который является средством командной строки WDK для установки драйверов, но не распространяемого. Пример кода средства Devcon предоставляется в WDK. Для повторного распространения можно реализовать собственное средство Devcon из примера кода и повторно распространить версию средства.

Установка и удаление пакета драйвера с помощью PnpUtil

Установка пакета драйверов:

  1. Откройте командное окно с повышенными привилегиями и задайте для каталога по умолчанию значение c:\тостер.

  2. Выполните одну из следующих команд:

    • Чтобы просто подготовить пакет драйвера, выполните следующие действия. pnputil /add-driver toaster.inf

    • Чтобы подготовить драйвер и установить его на существующих устройствах, выполните следующие действия. pnputil /add-driver toaster.inf /install

Удаление пакета драйверов:

  1. Откройте командное окно с повышенными привилегиями.

  2. Укажите имя INF изготовителя оборудования, соответствующее пакету драйверов, который вы хотите удалить из списка, возвращаемого pnputil /enum-drivers

  3. Выполните pnputil /delete-driver \<OEM INF name> /uninstall.

Установка и удаление пакета драйвера с помощью DevCon

Установка пакета драйверов:

  1. Откройте командное окно с повышенными привилегиями и задайте для каталога по умолчанию значение c:\тостер.

  2. Devcon.exe предоставляется в каталоге средства WDK версии x86, amd64 и версии ia64. Скопируйте соответствующую версию в каталог c:\тостер и выполните следующую команду.

    devcon.exe update <inf> <hwid>
    

    Рекомендуется использовать кавычки вокруг <hwid>. Для образца тостера это будет:

    devcon.exe update c:\toaster\toaster.inf "{b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster"
    

Удаление пакета драйверов:

Пакет драйверов не следует удалять из системы, пока устройство все еще использует его. Если для удаления пакета драйверов требуется удалить устройство, его можно удалить с помощью средства Devcon с помощью параметра remove. devcon.exe /? отображает все переключатели для этого средства. Чтобы получить конкретные сведения об использовании переключателя, необходимо добавить "help", как показано ниже для параметра remove.

devcon.exe help remove

После удаления устройства для удаления драйвера необходимо выполнить две команды. Используйте первую команду с параметром "dp_enum", чтобы найти имя INF-файла драйвера, соответствующее пакету драйверов, установленному на компьютере.

devcon dp_enum

Эта команда отобразит список всех файлов oemNnn.inf, соответствующих пакету драйверов, где Nnn — десятичное число со сведениями о классе и указанием сведений, как показано ниже.

oem39.inf
    Provider: Intel
    Class: Network adapters
oem4.inf
    Provider: Dell
    Class: ControlVault Device

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

devcon.exe dp_delete oem39.inf

Убедитесь, что драйвер Test-Signed работает правильно

Чтобы убедиться, что Toastpkg работает правильно, выполните следующее:

  1. Запуск диспетчер устройств

  2. Выберите Тостер в списке устройств. Пример см. на снимку экрана ниже.

    Снимок экрана: устройство тостера в диспетчере устройств.

  3. Чтобы открыть диалоговое окно Свойства драйвера, дважды щелкните тостер для пакета тостера и выберите Свойства.

  4. Чтобы убедиться, что тостер работает правильно, на вкладке Общие проверка поле Состояние устройства

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

Устранение неполадок с драйверами Test-Signed

См. статью Устранение неполадок с установкой подписывания драйверов , если у вас возникли трудности с этими процедурами.