Как известно в х64 битных платформах была введена процедура обязательной цифровой подписи всего того, что может попасть в ядро системы, а именно драйверов. О том, на сколько это эффективно и оправданно можно долго спорить, но только одно можно сказать точно — гимора разработчикам тут определенно добавилась, особенно тем, кто раньше никогда подписями не занимался. Также для многих стало крайне не очевидно, каким образом разрабатывать драйвер, когда нет на руках валидного сертификата, а тестировать ведь как-то надо. Вот сча я попытаюсь в краткой и доступной форме рассказать о том как это все делается.
Итак, прежде всего, я бы хотел выделить два типа сертификатов, которые я буду рассматривать в рамках данной статьи — тестовый и настоящий. Разница состоит в том, что настоящий сертификат подписан доверенным CA (Certification Authorities — доверенный издатель), типа VeriSign, GlobalSign ну или самим Microsoft, а тестовый подписан самопальным сертификатом типа от Васи Пупкина.
Тестовый сертификат
Как вы уже наверное догадались, именно с помощью этого типа сертификата можно спокойно разрабатывать драйвер, не имея на руках настоящего, но все не так просто, прежде чем его использовать надо проделать некоторые унылые и мудреные мероприятия:
Настоящий сертификат
Тут тоже не все так просто. Дело в том, что не любой CA может выдавать сертификаты для подписи драйверов Windows, а только те, которые авторизованы самой Microsoft, это значит, что корневые сертификаты этих издателей должны быть подписаны Microsoft — что, как раз и выражается в виде этого кросс-сертификата. Вот именно из-за отсутствия кросс-сертификата — тестовая подпись, никогда не будет работать как настоящая. Список доверенных CA, которые обладают такими кросс-сертификатами — представлен тут, там же можно скачать и сами кросс-сертификаты.
После того, как вы выложите несколько сотенок $$$ доверенному центру сертификации, они выдадут вам .pfx файл в котором будут содержаться публичный и приватный ключи. Вы его запустите и с помощью нехитрого диалога (как на рисунке ниже), установите в систему.

Подпись драйвера
Процесс подписи для тестового и настоящего сертификата во многом похожи, различия состоят лиш в том, что:
Итак приступим
Далее драйвер можно установить программно с помощью специальных АПИ либо с помощью замечательной тулзы KmdManager.
Подпись пакета драйверов
В реальной жизни подписи самого драйвера оказывается недостаточно, дело в том, что драйвера устройств как правило поставляются в комплекте с inf-файлом, в котором содержится информация о драйвере и устройствах которые он обслуживает. В этом случае необходимо будет сгенерить cat-файл, который содержит в себе инфу о всех файлах пакета, а потом подписать его точно также, как подписывали драйвер.
Для генерации cat-файла и его подписи нам понадобится:
EasySign
В результате всех моих исследований на предмет САБЖ-а, я некатал по-быстрому простенькую программку EasySign, которая может подписывать дрова без дополнительного гимора с командной строкой и bat-файлами. Возможно кому-то будет полезно.

Саму прогу можно скачать тут, а мануалку почитать ниже:
Литература по теме
http://msdn.microsoft.com/en-us/library/ff544865(VS.85).aspx
Итак, прежде всего, я бы хотел выделить два типа сертификатов, которые я буду рассматривать в рамках данной статьи — тестовый и настоящий. Разница состоит в том, что настоящий сертификат подписан доверенным CA (Certification Authorities — доверенный издатель), типа VeriSign, GlobalSign ну или самим Microsoft, а тестовый подписан самопальным сертификатом типа от Васи Пупкина.
Тестовый сертификат
Как вы уже наверное догадались, именно с помощью этого типа сертификата можно спокойно разрабатывать драйвер, не имея на руках настоящего, но все не так просто, прежде чем его использовать надо проделать некоторые унылые и мудреные мероприятия:
- Сгенерить сам сертификат и установить его. Это можно сделать с помощью тулзы makecert, например так:
Makecert -r -pe -ss PrivateCertStore -n "CN=TestCertforWDK" TestCert.cer
где
PrivateCertStore — название хранилища
TestCertforWDK — название самого сертификата
TestCert.cer — имя файла с сертификатом
(эта тулза входит в комплект WDK 6000/6001 и расположена bin/SelfSign, в WDK 7600 она почему то не входит...)
- Добавить этот сертификат в хранилище с доверенным корневыми CA. Открываем в mmc консоль Сертификаты (Run->mmc->File->Add/Remove Snap-in->Certificates) там находим свой сертификат (например в хранилище PrivateCertStore), копируем его в доверенные корневые издатели (Trusted Root Certification Authorities).
- Разрешить тестовые подписи. Для этого прописываем в администраторской консоли:
bcdedit.exe –set TESTSIGNING ON
и перезагружаемся, в итоге на десктопе, после перезагрузки, по углам красоваться соответствующие надписи.
Настоящий сертификат
Тут тоже не все так просто. Дело в том, что не любой CA может выдавать сертификаты для подписи драйверов Windows, а только те, которые авторизованы самой Microsoft, это значит, что корневые сертификаты этих издателей должны быть подписаны Microsoft — что, как раз и выражается в виде этого кросс-сертификата. Вот именно из-за отсутствия кросс-сертификата — тестовая подпись, никогда не будет работать как настоящая. Список доверенных CA, которые обладают такими кросс-сертификатами — представлен тут, там же можно скачать и сами кросс-сертификаты.
После того, как вы выложите несколько сотенок $$$ доверенному центру сертификации, они выдадут вам .pfx файл в котором будут содержаться публичный и приватный ключи. Вы его запустите и с помощью нехитрого диалога (как на рисунке ниже), установите в систему.

Подпись драйвера
Процесс подписи для тестового и настоящего сертификата во многом похожи, различия состоят лиш в том, что:
- для тествой подписи не нужен кросс-сертификат
- для тествой подписи можно не делать таймстамп
Итак приступим
- Качаем тулзу для подписи — signtool (тоже входит в комплект WDK6000/6001)
- Подписываем, с тестовым сертификатом:
signtool sign /v /s PrivateCertStore /n "TestCertforWDK" driver.sys
где
PrivateCertStore — имя хранилища
TestCertforWDK — имя тестового сертификата
driver.sys — имя драйвера
с настоящим сертификатом:
signtool sign /v /ac MSCV-GlobalSign.cer /s PrivateCertStore /n "YourTrueCertName" /t http://timestamp.globalsign.com/scripts/timstamp.dll driver.sys
где
MSCV-GlobalSign.cer — имя кросс-сертификата
YourTrueCertName — имя настоящего сертификата
timestamp.globalsign.com/scripts/timstamp.dll — адрес таймстампингового центра, в моем случае global sign
Далее драйвер можно установить программно с помощью специальных АПИ либо с помощью замечательной тулзы KmdManager.
Подпись пакета драйверов
В реальной жизни подписи самого драйвера оказывается недостаточно, дело в том, что драйвера устройств как правило поставляются в комплекте с inf-файлом, в котором содержится информация о драйвере и устройствах которые он обслуживает. В этом случае необходимо будет сгенерить cat-файл, который содержит в себе инфу о всех файлах пакета, а потом подписать его точно также, как подписывали драйвер.
Для генерации cat-файла и его подписи нам понадобится:
- Корректный inf-файл (запасайтесь бубнами ребятки)
- Тулза которая генерит этот cat-файл из inf-файлов — inf2cat (эта тулза входит в комплект WDK6001/7600, и написана, как не странно, на .NET)
- После чего генерим cat-файл, например так
inf2cat.exe /driver:release\amd64 /os:Vista_x64,Server2003_x64,Server2008_x64
где
release\amd64 — папка в которой находится inf-файл и драйверы
Vista_x64,Server2003_x64,Server2008_x64 — список ОС, на которых должен работать драйвер - Подписываем его точно также, как и драйвер
signtool sign /v /ac MSCV-GlobalSign.cer /s PrivateCertStore /n "YourTrueCertName" /t http://timestamp.globalsign.com/scripts/timstamp.dll catalog.cat
сам драйвер при этом подписывать не обязательно. - Проверяем, что все хорошо подписалось, для этого открываем свойство .cat файла (или драйвера) и смотрим вкладку Digital Signatures — если есть то можем полюбоваться на результат, если нет, то где-то накосячили.
Также более достоверно можно проверить с помощью командной строки
signtool verify /pa /v /c catalog.cat
EasySign
В результате всех моих исследований на предмет САБЖ-а, я некатал по-быстрому простенькую программку EasySign, которая может подписывать дрова без дополнительного гимора с командной строкой и bat-файлами. Возможно кому-то будет полезно.

Саму прогу можно скачать тут, а мануалку почитать ниже:
- Вбиваем в Inf Dir путь к папке где лежит сам .inf файл и все необходимые файлы к нему прилагающиеся.
- Выбираем ОСи где работает драйвер.
- Cross Cert — указываем путь к кросс-сертификату, если нужно подписать драйвер по-настоящему
- Cert Store — названия хранилища, где лежит наш сертификат (например PrivateCertStore)
- Cert Name — название сертификата (например TestCertforWDK), если сертификат один в хранилище, то можно и не заполнять это поле.
- Time Stamp — адрес таймстампингового центра, для тестового сертификата — можно оставить пустым
- Файлы которые надо подписать, тут нужно обязательно добавить cat файл (если еще не создан, то прописать его имя вручную), а также можно добавить все файлы драйверов
- Generate Catalog Only — если подписывать не надо, а только создать .cat файл
- Жмем Sign — чтобы создать cat-файл и подписать, жмем Log — чтобы почитать что произошло, часто бывают ошибки, например неправильно составлен inf-файл, либо signtool чего-то не нашел и т.п.
Литература по теме
http://msdn.microsoft.com/en-us/library/ff544865(VS.85).aspx