Как создать самозаверяющий сертификат для подписи кода в Windows?

Как создать самозаверяющий сертификат для подписи кода с помощью инструментов из SDK Windows?

Ответ 1

Обновленный ответ

Если вы используете следующие версии Windows или более поздние версии: Windows Server 2012, Windows Server 2012 R2 или Windows 8.1, то MakeCert теперь устарел, и Microsoft рекомендует использовать Командлет PowerShell New-SelfSignedCertificate.

Если вы используете более старую версию, такую ​​как Windows 7, вам нужно придерживаться MakeCert или другого решения. Некоторые люди предлагают модуль открытого ключа инфраструктуры Powershell (PSPKI).

Оригинальный ответ

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

Создание самозаверяющего центра сертификации (CA)

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
         -a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ = разрешить пакетную строку командной строки)

Это создает самозаверяющий (-r) сертификат с экспортируемым закрытым ключом (-pe). Он называется "Мой CA" и должен быть помещен в хранилище CA для текущего пользователя. Мы используем алгоритм SHA-256. Ключ предназначен для подписания (-sky).

Закрытый ключ должен храниться в файле MyCA.pvk, а сертификат - в файле MyCA.cer.

Импорт сертификата CA

Потому что нет смысла иметь сертификат ЦС, если вы ему не доверяете, вам нужно будет импортировать его в хранилище сертификатов Windows. Вы можете использовать snapin MMC сертификатов, но из командной строки:

certutil -user -addstore Root MyCA.cer

Создание сертификата подписи кода (SPC)

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

Это почти то же самое, что и выше, но мы предоставляем ключ и сертификат эмитента (переключатели -ic и -iv).

Мы также хотим преобразовать сертификат и ключ в файл PFX:

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

Если вы хотите защитить файл PFX, добавьте ключ -po, иначе PVK2PFX создаст файл PFX без кодовой фразы.

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

signtool sign /v /f MySPC.pfx ^
              /t http://timestamp.url MyExecutable.exe

(Посмотрите, почему временные метки могут иметь значение)

Если вы импортируете файл PFX в хранилище сертификатов (вы можете использовать PVKIMPRT или snapin MMC), вы можете подписать код следующим образом:

signtool sign /v /n "Me" /s SPC ^
              /t http://timestamp.url MyExecutable.exe

Некоторые возможные временные метки для signtool /t:

  • http://timestamp.verisign.com/scripts/timstamp.dll
  • http://timestamp.globalsign.com/scripts/timstamp.dll
  • http://timestamp.comodoca.com/authenticode

Полная документация корпорации Майкрософт

Загрузки

Для тех, кто не является разработчиками .NET, вам понадобится копия Windows SDK и .NET framework. Текущую ссылку можно найти здесь: SDK и .NET (которая устанавливает makecert в C:\Program Files\Microsoft SDKs\Windows\v7.1). Ваш пробег может отличаться.

MakeCert доступен из командной строки Visual Studio. Visual Studio 2015 имеет его, и его можно запустить из меню "Пуск" в Windows 7 в разделе "Командная строка разработчика для VS 2015" или "VS2015 x64 Native Tools Command Prompt" (возможно, все они в одной папке).

Ответ 2

Ответ Роджера был очень полезен.

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

certutil -addstore Root Demo_CA.cer

который ответ Роджера не совсем покрывал.

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

REM Demo of signing a printer driver with a self-signed test certificate.
REM Run as administrator (else devcon won't be able to try installing the driver)
REM Use a single 'x' as the password for all certificates for simplicity.

PATH %PATH%;"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";"c:\Program Files\Microsoft SDKs\Windows\v7.0\Bin";c:\WinDDK\7600.16385.1\bin\selfsign;c:\WinDDK\7600.16385.1\Tools\devcon\amd64

makecert -r -pe -n "CN=Demo_CA" -ss CA -sr CurrentUser ^
   -a sha256 -cy authority -sky signature ^
   -sv Demo_CA.pvk Demo_CA.cer

makecert -pe -n "CN=Demo_SPC" -a sha256 -cy end ^
   -sky signature ^
   -ic Demo_CA.cer -iv Demo_CA.pvk ^
   -sv Demo_SPC.pvk Demo_SPC.cer

pvk2pfx -pvk Demo_SPC.pvk -spc Demo_SPC.cer ^
   -pfx Demo_SPC.pfx ^
   -po x

inf2cat /drv:driver /os:XP_X86,Vista_X64,Vista_X86,7_X64,7_X86 /v

signtool sign /d "description" /du "www.yoyodyne.com" ^
   /f Demo_SPC.pfx ^
   /p x ^
   /v driver\demoprinter.cat

certutil -addstore Root Demo_CA.cer

rem Needs administrator. If this command works, the driver is properly signed.
devcon install driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

rem Now uninstall the test driver and certificate.
devcon remove driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

certutil -delstore Root Demo_CA

Ответ 4

Это довольно легко, используя команду New-SelfSignedCertificate в Powershell. Откройте powershell и запустите эти 3 команды.

1) Создать сертификат:
   $ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Тип CodeSigning -CertStoreLocation Cert:\CurrentUser\My

2) установите для него пароль:
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force -AsPlainText

3) Экспортировать его:
  Export-PfxCertificate -Cert "cert:\CurrentUser\My\$($ cert.Thumbprint)" -FilePath "d:\testcert.pfx" -Password $CertPassword

Ваш сертификат testcert.pfx будет размещен @D:/