Подписание драйверов в W7 x64 (решено)

Программирование, Хакинг, Безопасность, Софт, Железо, а также всё связанное с компьютерами
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Подписание драйверов в W7 x64 (решено)

Сообщение Андрей Карпишин »

До сих пор однозначно не решённый вопрос. Эти выходные посвящу его решению.

Задача. Подписать неподписанный драйвер, чтобы он работал в Win 7 x64. Не использовать патчи системных файлов винды, кнопку F8 при загрузке, или тестовый (TESTSIGNING ON) режим.

Дополнение: работа драйвера требуется только на ОДНОЙ КОНКРЕТНОЙ машине.

Варианты решения: подписание цепочкой сертификатов (в этом надо разобраться).
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Вопрос по подписанию драйверов в W7 x64

Сообщение Андрей Карпишин »

Хабр писал(а):"Расскажите, будьте так добры, как запустить самоподписанный драйвер, не активируя тестовый режим (т.е. не используя команду bcdedit.exe /set testsigning on, которая помимо включения режима доверия к самоподписанным драйверам заодно отключает некоторые функции по управлению цифровым контентом).
Для информации: сделать доверенным свой сертификат невозможно, т.к. его для этого требуется подписать кросс-сертификатом от MS или чьим-нибудь ещё, чтобы выстроилась цепочка сертификатов. Даже если принудительно добавите сертификат в качестве корневого, при попытке использовать его для драйверов система пошлёт Вас куда подальше (несмотря на то, что в свойствах драйвера будет говориться, что сертификат совершенно валиден)."

"То что сделать свой сертификат доверенным невозможно — это вы уже очевидную ерунду говорите. Это же ваш компьютер в конце концов :) Любой админ поднимавший свой CA это знает и для этого не надо быть низкоуровневым разработчиком.
Вам нужно добавить корневой сертификат CA в TRCA, и скорее всего еще нужен сертификат которым производилась подпись (или достаточно опять сертификата CA) в Trusted Publishers.
Всё это разумеется надо делать в хранилище сертификатов компьютера, а не пользователя.
Я, честно говоря, действительно не загружал таким образом самоподписанные драйверы самостоятельно (я не разработчик, обычно использую PKI для других целей), но мнению того MVP который мне об этом сообщал, склонен доверять, тем более что его компания использует (или использовала) такой подход для своего ПО."

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

"Я не увидел у вас в ответе подтверждений что вы делали именно как я сказал, так что извините, но некоторые вопросы задам снова:
Как генерировали сертификаты?
Какие опции включены в Key Usage у подписывающего сертификата?
Точно ли все операции производились с хранилищем компьютера, а не пользователя?
В TRCA надо добавлять сертификат с публичным ключом CA, а не тот которым подписываем драйвер. Так и делали?
В TP надо добавлять либо сертификат с публичным ключом CA, либо непосредственно тот которым подписываем. Не уверен, так что для эксперимента лучше добавить оба."
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Вопрос по подписанию драйверов в W7 x64

Сообщение Андрей Карпишин »

reverse4you.org писал(а):Цепочка сертификатов должна уходить рутом в доверенный сертификат МС (для этого и нужен кросс-сертификат при подписи релизной версии). Список паблик ключей доверенных корневых сертификатов жестко прибит гвоздями внутри ci.dll. Так что наиболее реалистичный вариант - купить самый дешевый сертификат
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Вопрос по подписанию драйверов в W7 x64

Сообщение Андрей Карпишин »

Цепочка сертификатов должна уходить рутом в доверенный сертификат МС
что еще за доверенный сертификат МС? Чем он отличается от любого другого?
Список паблик ключей доверенных корневых сертификатов жестко прибит гвоздями внутри ci.dll
Да, в этой библиотеке содержится список доверенных корневых сертификатов различных издателей, именно из него Windows получает информацию о том кому доверять сразу после установки. И? Это не значит что в список доверенных сертификатов нельзя добавить свой корневой сертификат после установки, с помощью обычной оснастки.

Короче говоря, рассказываю секретную тонкость, подозреваю может быть кому-то не известна:
Проверяйте сами, не доверяйте профессионалам (мне тоже). У вас не получается, а у остальных получается? Разбирайтесь, ищите в чем дело, спрашивайте (приводя условия и результаты эксперимента).

Я вот увидел у вас ссылку с подтверждением что это работает, и довод кого-то, что нет, и насколько я понимаю вы сами даже не пробовали. Я знаю что самоподписанный сертификат прекрасно добавляется в доверенные (я сам это неоднократно проверял). Я знаю что в сертификатах нет флага "ЭтоСертификатМС" (я сам смотрел). Я не вижу никаких причин почему подписывать драйверы своим сертификатом невозможно. Даже наоборот, я вижу кучу подтверждений что это возможно.


Курсивом - товарищ с хабра.
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Подписание драйверов в W7 x64 (решено)

Сообщение Андрей Карпишин »

Был получен ответ ещё от одного эксперта

Олег Казакевич:
Для того, чтобы драйвер был загружен на Vista-64 и выше, а также на
Windows 8 и выше в режиме Secure Boot, вне тестовых режимов и т.п.,
он должен быть подписан, причем в подписи обязательно должен быть
соответствующий кросс-сертификат от Microsoft. Таких кросс-сертификатов
существует всего порядка 20, каждый для конкретной конторы, которая
продает сертификаты - Symantec, Thawte, GlobalSign, DigiCert и т.п.
Если у вас самопальный сертификат, созданный каким-нибудь makecert.exe,
то к нему просто не существует кросса. И система такой драйвер загружать не будет.
Существует лишь 4 легальных способа загрузки драйвера на обозначенных системах:
1) Подписать драйвер настоящим сертификатом, купленным у одной из организаций типа Symantec
(с кросс-сертификатом)
2) Загружать систему в тестовом режиме, используя самопальный сертификат.
3) Нажимать при загрузке F8 и отключать проверку цифровых подписей.
4) Перевести систему в режим отладки и загружать ее с подключенным отладчиком ядра (например, WinDBG).
Других путей нет (ну если только не считать всякие там патчи ядра, уязвимости и т.п.).
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Подписание драйверов в W7 x64 (решено)

Сообщение Андрей Карпишин »

Если использовать при подписи timestamp, то драйвер подписанный сертификатом будет действовать и после окончания срока действия сертификата?

- Да.
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Вопрос по подписанию драйверов в W7 x64

Сообщение Андрей Карпишин »

xaegr писал(а):"То что сделать свой сертификат доверенным невозможно — это вы уже очевидную ерунду говорите. Это же ваш компьютер в конце концов :) Любой админ поднимавший свой CA это знает и для этого не надо быть низкоуровневым разработчиком.
Вам нужно добавить корневой сертификат CA в TRCA, и скорее всего еще нужен сертификат которым производилась подпись (или достаточно опять сертификата CA) в Trusted Publishers.
Всё это разумеется надо делать в хранилище сертификатов компьютера, а не пользователя.
Я, честно говоря, действительно не загружал таким образом самоподписанные драйверы самостоятельно (я не разработчик, обычно использую PKI для других целей), но мнению того MVP который мне об этом сообщал, склонен доверять, тем более что его компания использует (или использовала) такой подход для своего ПО."
Товарищ с Хабра перепутал разные типы сертификатов: для SSL (валидности сайта) и code signing. Требования ко второму выше. (Слышал звон, да не знает, где он.) А компания, на которую он ссылается, видимо работает как раз с сертификатами первого типа.
Аватара пользователя
Андрей Карпишин
Архитектор
Сообщения: 9195
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов, МО
Благодарил (а): 1214 раз
Поблагодарили: 556 раз

Re: Подписание драйверов в W7 x64 (решено)

Сообщение Андрей Карпишин »

Приобретение цифрового сертификата для подписи драйвера (частное лицо)

Автор: Казакевич Олег.
Приветствую всех, кто заглянул.

В этой теме я бы хотел поделиться своим опытом приобретения цифрового сертификата.
Подобные темы уже поднимались:

http://rsdn.ru/forum/asm/3634499.aspx
http://rsdn.ru/forum/shareware/4306500.aspx
http://rsdn.ru/forum/asm/4343915.aspx
http://rsdn.ru/forum/shareware/4269597.aspx
http://rsdn.ru/forum/shareware/4517008.aspx
http://rsdn.ru/forum/shareware/3477809.aspx

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

Итак, ...

Что нужно

А нужно немного — получить цифровой сертификат на частное лицо, и чтобы этим сертификатом
можно было подписывать не только exe и dll, но и драйверы на 64-битных Vista и выше.
Именно частное лицо. Не на контору, ни даже на ИП, а на самого обычного "Васю Пупкина".

Предыстория

До недавнего времени я уже был наслышан про то, что сертификаты продают далеко не каждому,
только на компанию, нужен DUNS-номер, офис, представительство в США и т.п., а простому
смертному, тем более из такой страны как Беларусь, вообще рассчитывать не на что.

Разведка

Разведку я начал со страницы, где Microsoft публикует кросс-сертификаты для подписи драйверов.
Как известно, каждому сертификату от вендора соответствует строго определенный кросс-сертификат от Microsoft и они оба должны быть включены в подпись, чтобы драйвер мог запуститься на нужных системах (имеется в виду, понятное дело, системы от 64-битной Vista и выше).
Вот эта страница: http://msdn.microsoft.com/en-us/library ... 87315.aspx

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

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

Как известно, GlobalSign продает Authenticode-сертификаты двух типов — на контору (Software Vendors & Organizations, $229 в год) и на индивидуальных разработчиков (Individual Developers, $129 в год). То, что сертификатами первого типа можно подписывать драйверы, мне было известно, но на счет второго оставались сильные сомнения, тем более, что ни в FAQ, ни на форумах я подробного разъяснения не нашел.

Задал вопрос в техподдержку — сказали да, сертификаты для индивидуалов позволяют подписывать драйверы
на Vista-64. Но мне этого показалось мало. Я был в курсе, что GlobalSign есть главный корневой сертификат, называется он GlobalSign Root CA (1998-2028), и для него Microsoft выпустила нужный кросс, позволяющий использовать сертификаты, выданные GlobalSign Root CA для подписи драйверов. Я задал еще один вопрос в техподдержку — можно ли при заказе сертификата для индивидуального разработчика выбрать этот сертификат в качестве корневого. Мне ответили — да, с этим нет проблем. На этом разведку можно было считать завершенной.

Подготовка

Для оформления заказа на GlobalSign понадобится:

1. Пластиковая карта типа Visa или Mastercard со счетом в долларах или евро. Я сделал себе самую обычную дебетовую карту Visa Classic в самом обычном банке. Разумеется, не все пластиковые карты позволяют рассчитываться в интернете. Например, Visa Electron в общем случае для этого не предназначена.

2. Скан паспорта (последняя страница) в электронном виде.

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

4. Заявление на получение сертификата, скан. Шаблон качать здесь:
https://www.globalsign.com/resources/co ... n-form.pdf
Обращаю внимание — имя, фамилию и прочие данные нужно указывать точь-в-точь как на странице заказа (будет описано ниже) и в паспортных данных. Например, мое имя по-английски правильно было бы писать как Oleg, однако по паспорту я Aleh — так везде и указывал. Вся информация указывается латиницей, телефон можно указать в международном формате. Поле "Certificate OrderID" (номер заказа) заполняется только после процедуры онлайн-покупки — тогда этот самый OrderID и будет присвоен. "Applicant's Signature" — это поле для подписи от руки. То есть, заполняем форму, распечатываем, берем ручку, ставим подпись и делаем скан. Все введенные поля лучше хорошенько перепроверить.

Покупка

Идем на http://www.globalsign.com. Лучше все операции выполнять из-под браузера FireFox, в других были замечены глюки разной степени странности. Этой же рекомендации советуют следовать и на GlobalSign.

Идем в Products/Code Signing, жмем "Buy Now" напротив "Individual Developers". Сохраняем "campaign code",
показанный на первой странице — это нужно для правильного формирования цены, без использования данного кода вам будет выставлен счет на неправильную сумму. Вот как комментирует этот момент один из работников техподдержки GlobalSign:
"We are running a promotion in code signing for individuals to make the price $129
Please go to http://www.globalsign.eu/code-signing/c ... opers.html
And use this discount code
USD – CAD1TH4EL3PKMHDF
GBP – CAPKG9H8X7A5ZBC1
EUR – CALSFB0E1WRWTPD4".

На странице "Account Setup" внимательно и аккуратно заполняем все нужные поля формы. В "Organization Name"
вписываем свое полное имя, как в паспорте. Например, Ivanov Ivan. Указываем свой E-mail, а также логин и пароль для доступа к будущему аккаунту на сайте GlobalSign.

На странице "Product Details" вписываем "campaign code" в соответствующее поле и жмем "Redeem Code" — будет выставлена правильная цена.

На странице "Certificate Identity Details" ставим галочку в "Individuals" и задаем так называемый пикап-пароль (pickup password). Этот пароль вам понадобится позже, когда вы будете забирать сертификат.

Дальше следует "Payment Details" — то есть, собственно, оплата. Указываем все реквизиты, точь-в-точь как на пластиковой карте, в том числе и поля "Statement" — вся нужная информация находится на самой карте, если кто не в курсе.

Если все пройдет успешно, а иначе и быть не может, данному заказу будет присвоен определенный OrderID.
Соответствующее электронное письмо придет на почту. Этот OrderID следует вписать в заявление на получение сертификата (см. выше) и все это, вместе со сканами паспорта и счета за телефон, отправить на электронный адрес vetting-us@globalsign.com. Если верить инструкциям, наличие данных документов существенно ускоряет процесс.

Кроме OrderID, для вас в системе GlobalSign будет создан аккаунт с именем вида PARxxxxxx_yyyyyyyyyy, где xxxxxx — некое число, а yyyyyyyyyy — логин, который вы указывали при заказе сертификата.
Например, PAR123456_sashka1980. С этими данными можно будет заходить в систему и управлять своими заказами.

Ожидание

Следует учесть, что офис GlobalSign находится в таком часовом поясе, что ответа на письмо, отправленное утром, можно ожидать не раньше вечера. За все время, которое я занимался сертификатом, со мной, помимо техподдержки, контактировало два человека — первый интересовался, почему я не завершил один из заказов (я тогда забыл про campaign code и недоумевал, почему цена на странице заказа указана $229, хотя на главной "обещали" $129), второй непосредственно обрабатывал сам заказ. Оба были предельно корректными, охотно давали разъяснения и направляли мои действия в нужное русло. Я ожидал, что мне, возможно, позвонят по телефону для проверки и был в ужасе, потому что разговорный английский у меня просто жуткий. Но не позвонили. В итоге уже через сутки мне пришло электронное письмо с приятным названием: "Certificate Download Ready".

Получение сертификата

ВНИМАНИЕ!
Получение сертификата — разовая процедура, ее следует проводить осторожно, чтобы не "профукать" сертификат каким-нибудь нечаянным действием, после чего, вероятно, предстоят определенные разбирательства с техподдержкой. Суть в том, что public- и private-ключи генерируются однократно и только в тот момент, когда вы желаете забрать сертификат. После этого страница уничтожается, так что никто, кроме вас, не сможет получить ключи. И я настойчиво рекомендую использовать только FireFox.

Итак, в электронном письме вам пришлют ссылку на временную страницу, где будут сгенерированы ключи и откуда вы сможете импортировать их в браузер. Там ничего сложного, просто нужно будет нажать на пару больших кнопок. Здесь понадобится пикап-пароль, созданный при заказе сертификата (см. выше). Перед тем, как забрать сертификат с этой страницы, зайдите в настройки FireFox, на вкладку "Защита", и включите мастер-пароль. Без этого шага сертификат будет экспортироваться из браузера без приватного ключа, что в контексте рассматриваемого вопроса бессмысленно. Вот и все. После процедуры импорта сертификата в браузер можно зайти в настройки FireFox, на вкладку "Дополнительно", открыть список сертификатов, найти среди них свой и выполнить его экспорт в файл. Я, к примеру, получил файл с расширением .p12.

Свойства

Данный сертификат от GlobalSign, как я и ожидал, обладает всеми необходимыми и привлекательными свойствами. Во-первых, его "узнают" все без исключения "голые" системы от XP до Windows 8 Release Preview; не требуется задействовать ни интернет, ни службы обновления сертификатов. Во-вторых, подпись драйвера тоже проходит на
отлично, как и проверка утилитой signtool (signtool.exe verify /kp), надо только не забыть про кросс-сертификат. Я уже опробовал данный серт на разных 64-битных системах от Vista и выше — там с запуском
драйвера все в полном порядке. В-третьих, в корне цепочки доверия тот самый GlobalSign Root CA, валидный до 2028 года. Именно тот, который я хотел.

Вот и все, собственно.
Благодарю за внимание !