Мой подписанный драйвер дает Windows (Windows 7 с оперативным исправлением SHA256), которая не запускается и выдает код ошибки 0xC0000428 (Windows не может проверить цифровую подпись для этого файла).
Я взял на себя проект драйвера, созданный с помощью Visual Studio 2010, и моей первой задачей было обновить сертификат подписи кода с истекшим сроком действия. Первоначально цифровой сертификат был с Global Sign, а теперь используется Digi Cert. Первоначальный программист написал мне в электронном письме, что у него ежегодно возникают проблемы с этой темой.
Я проверил рабочий, но просроченный файл драйвера icsflt.sys
и увидел, что это SHA256 с отпечатком SHA1. Все остальное работает. Я пробовал много разных вариантов (сертификат с двойной подписью, SHA1 и SHA2). Моя последняя попытка, прямо из службы технической поддержки Digi Cert, использует следующую командную строку.
C:\ICS\IM6000\Certificate>"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /a "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys"
Done Adding Additional Store
Successfully signed: C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys
Вот сертификат, похожий на оригинал.
Вот базовый сертификат, ясно показывающий SHA256 для алгоритма дайджеста. Сертификаты взяты с машины сборки. Первый снимок экрана «Диспетчера загрузки Windows» сделан на тестовой машине.
Вот некоторые ссылки, которые я использовал с веб-сайта Digi Certs.
Код подписи SignTool.exe Командная строка
Установка сертификата подписи кода
Вот рабочий вид сертификата с истекшим сроком действия.
Вот свойства драйвера Цифровая подпись для хорошего / рабочего драйвера.
Их можно отличить друг от друга, так как я переименовал хороший / рабочий в icflt-good.sys
. Если не считать названия компании, дат и центра сертификации (CA), они выглядят одинаково, но Windows 7 напоминает новый от Digi Cert.
Вот код предыдущей командной строки signtool.exe
, которую я закомментировал.
@echo on
@REM see "How to Release-Sign a Driver Package" and "Release-Signing a Driver through an Embedded Signature in Windows DDK"
@REM despite the store's name seems to be Personal we should use MY when using Signtool. Otherwise the certificate is not found.
@REM when Personal store is created with makecert, another Personal is created. Weird.
@REM Signtool sign /v /ac MSCV-GlobalSign.cer /s MY /sha1 5250f1a5ddd11e3e4e924757e6da1c43dd3487c0 /t http://timestamp.globalsign.com/scripts/timstamp.dll %mydriverpath%
@REM Signtool sign /v /ac MSCV-GlobalSign.cer /s MY /sha1 5D743B02DCDE74B16D133BDFEB2E1C5F6F44E966 /t http://timestamp.globalsign.com/scripts/timstamp.dll %mydriverpath%
@REM check $\IM6000\Certificate\current for the exact file names and password
@REM Signtool sign /v /ac %PROJECT_DIR%\..\Certificate\current\MSCV-GlobalSign.cer /f %PROJECT_DIR%\..\Certificate\current\OS201602156091.pfx /p 1C73295775925A7EE1C6D35ADF9DF611A55A60B8 /t http://timestamp.globalsign.com/scripts/timstamp.dll %mydriverpath%
@REM Signtool sign /v /ac %PROJECT_DIR%\..\Certificate\current\GlobalSignRootCA.crt /f %PROJECT_DIR%\..\Certificate\current\OS201701106786.pfx /p ICScertificate2017 /t http://timestamp.globalsign.com/scripts/timstamp.dll %mydriverpath%
@REM Signtool sign /v /fd sha256 /ac %PROJECT_DIR%\..\Certificate\current\GlobalSignRootCA.crt /f %PROJECT_DIR%\..\Certificate\current\OS201701106786.pfx /p ICScertificate2017 /tr http://timestamp.globalsign.com/scripts/timstamp.dll?td=sha256 /td sha256 %mydriverpath%
После долгих исследований я понял проблему. (Пожалуйста, отметьте вопрос и особенно ответьте на него.)
Для подписи драйверов уровня ядра требуется перекрестная подпись с использованием переключателя /AC
«Дополнительный сертификат», который создает цепочку перекрестных сертификатов для корневого сертификата Microsoft.
Соответствующие ссылки:
Ссылки на перекрестный сертификат Microsoft
Примечание: статья по следующей ссылке неверна. Отпечаток большого пальца НЕ ОБЯЗАТЕЛЬНО совпадать. Эмитент, однако, должен точно соответствовать.
Драйверы режима ядра с перекрестной подписью
Получить Эмитента требуется
Я зашел в mmc и добавил сертификаты (личные). Затем я дважды щелкнул свой сертификат SHA256 и отметил эмитента, который в моем случае был:
CN = DigiCert Assured ID Root CA
OU = www.digicert.com
O = DigiCert Inc
C = US
Взаимодействие с другими людьми Отпечаток моего сертификата, который не имеет значения, следующий:
05 63 b8 63 0d 62 d7 5a bb c8 ab 1e 4b df b5 a8 99 b2 4d 43
Список перекрестных сертификатов Microsoft снова - здесь. Моя загрузка была DigiCert Assured ID Root CA
, на которой есть отпечаток:
ba 3e a5 4d 72 c1 45 d3 7c 25 5e 1e a4 0a fb c6 33 48 b9 6e
Я использовал ссылку скачать, чтобы получить файл. Это дало мне файл «DigiCert Assured ID Root CA.crt».
Примечание: мне сказали, что сертификат должен быть расширением CER. Мое тестирование и беседа с DigiCert показали, что это неправда. ЭЛТ в порядке.
Командная строка инструмента рабочего знака:
C:\ICS\IM6000\Certificate>"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /v /ac "DigiCert Assured ID Root CA.crt" /tr http://timestamp.digicert.com /td sha256 /fd sha256 /a "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys"
Чтобы убедиться, что знак является правильным крестиком, настоятельно рекомендую ввести следующую строку:
"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" verify /kp /v "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys"
Обратите внимание на этот результат проверки:
Verifying: C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys
Signature Index: 0 (Primary Signature)
Hash of file (sha256): FAFB2B31B8ED4A9E8F9EC84196E7E52009A4C709521457FD83FC1945DCF5872F
Signing Certificate Chain:
Issued to: DigiCert Assured ID Root CA
Issued by: DigiCert Assured ID Root CA
Expires: Sun Nov 09 17:00:00 2031
SHA1 hash: 0563B8630D62D75ABBC8AB1E4BDFB5A899B24D43
Issued to: DigiCert SHA2 Assured ID Code Signing CA
Issued by: DigiCert Assured ID Root CA
Expires: Sun Oct 22 05:00:00 2028
SHA1 hash: 92C1588E85AF2201CE7915E8538B492F605B80C6
Issued to: JMR Electronics, Inc.
Issued by: DigiCert SHA2 Assured ID Code Signing CA
Expires: Mon Jan 28 05:00:00 2019
SHA1 hash: 9CDC225480659E8CDD6E794A81455C905403755B
The signature is timestamped: Mon Jun 04 16:35:45 2018
Timestamp Verified by:
Issued to: DigiCert Assured ID Root CA
Issued by: DigiCert Assured ID Root CA
Expires: Sun Nov 09 17:00:00 2031
SHA1 hash: 0563B8630D62D75ABBC8AB1E4BDFB5A899B24D43
Issued to: DigiCert SHA2 Assured ID Timestamping CA
Issued by: DigiCert Assured ID Root CA
Expires: Tue Jan 07 05:00:00 2031
SHA1 hash: 3BA63A6E4841355772DEBEF9CDCF4D5AF353A297
Issued to: DigiCert SHA2 Timestamp Responder
Issued by: DigiCert SHA2 Assured ID Timestamping CA
Expires: Mon Jan 17 17:00:00 2028
SHA1 hash: 400191475C98891DEBA104AF47091B5EB6D4CBCB
Cross Certificate Chain:
Issued to: Microsoft Code Verification Root
Issued by: Microsoft Code Verification Root
Expires: Sat Nov 01 06:54:03 2025
SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3
Issued to: DigiCert Assured ID Root CA
Issued by: Microsoft Code Verification Root
Expires: Thu Apr 15 12:51:37 2021
SHA1 hash: BA3EA54D72C145D37C255E1EA40AFBC63348B96E
Issued to: DigiCert SHA2 Assured ID Code Signing CA
Issued by: DigiCert Assured ID Root CA
Expires: Sun Oct 22 05:00:00 2028
SHA1 hash: 92C1588E85AF2201CE7915E8538B492F605B80C6
Issued to: JMR Electronics, Inc.
Issued by: DigiCert SHA2 Assured ID Code Signing CA
Expires: Mon Jan 28 05:00:00 2019
SHA1 hash: 9CDC225480659E8CDD6E794A81455C905403755B
Successfully verified: C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys
Number of files successfully Verified: 1
Number of warnings: 0
Number of errors: 0
Ключ здесь, помимо Successfully verified
, цепочка перекрестных сертификатов начинается с Issued to: Microsoft Code Verification Root
и заканчивается моим сертификатом подписи цифрового кода и всем, что между ними. Это то, чего Microsoft хочет от Windows. Windows 7 или Windows 10 значения не имеют.
Мне также приходилось использовать signtool.exe
как минимум из Windows 8.1. Более ранние версии не поддерживали все необходимые переключатели, которые мне сказали использовать.
Хотя в конце концов мне не понадобился сертификат SHA1, выяснение того, как его получить, заняло несколько циклов. Мне несколько раз говорили, что мне это нужно, но я этого не делал. Всем, кому интересно, инструкция по получению - это здесь. В настоящее время все является SHA256 даже в Windows 7 с исправлением.