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

Ответы:

363

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

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

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

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

Хотя вы можете создать самоподписанный сертификат для подписи кода (SPC - Software Publisher Certificate ) за один раз, я предпочитаю делать следующее:

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

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

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

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

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

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

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

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 или оснастку MMC), вы можете подписать код следующим образом:

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

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

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

Полная документация Microsoft

Загрузки

Для тех, кто не является разработчиком .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» (возможно, все они находятся в одной папке).

Роджер Липскомб
источник
Есть ли способ заполнить поле адреса электронной почты сертификата, используя этот метод? Щелкните правой кнопкой мыши exe> properties> digital signatures, и электронная почта будет отображаться как «недоступная» после подписания.
cronoklee
Если вы получаете ошибки «слишком много параметров», то вы проверяете, что случайно не отредактировали один из дефисов. В противном случае - перепечатайте дефисы - не копируйте пасту.
указ
8
@cronoklee Чтобы заполнить поле электронной почты сертификата, просто добавьте E=your@email. Например:makecert -pe -n "CN=My SPC,E=email@domain" ........
Роб W
1
Не нужен ли вам ключ расширенного использования, -eku 1.3.6.1.5.5.7.3.3чтобы сертификат можно было использовать для подписи кода (я знаю, что powershell не сможет подписать сценарии, если он его пропустит)
Скотт Чемберлен,
1
@AdamPhelps, Windows не научится доверять вашему сертификату. Ваши пользователи должны установить сертификат CA в Root store. Вообще говоря, это плохая идея (поскольку сертификаты корневого ЦС можно использовать в гнусных целях). Это может иметь смысл в сценарии предприятия, однако.
Роджер Липскомб
36

Как указано в ответе, чтобы использовать неосмотрительный способ подписи собственного сценария, следует использовать New-SelfSignedCertificate .

  1. Сгенерируйте ключ:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Экспортируйте сертификат без закрытого ключа:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0] сделает эту работу для случаев, когда у вас более одного сертификата ... Очевидно, что индекс будет соответствовать сертификату, который вы хотите использовать ... или используйте способ фильтрации (по thumprint или эмитенту).

  1. Импортируйте его как доверенного издателя
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Импортируйте его как корневой центр сертификации.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Подпишите скрипт (если здесь он называется script.ps1, исправьте путь соответствующим образом).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

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

chaami
источник
Спасибо за это. Я должен был начать с нижних ответов в первую очередь!
mdiehl13
Спасибо. Это решило все мои проблемы, пытаясь заставить этот «на вид простой» процесс работать.
Дейв
1
Я получил ошибку на «2». из-за (get-ChildItem ...)возврата более одного сертификата, поэтому я поставил «[0]» в конце, и это сработало. Как вExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
Лундман
1
@Lara спасибо за отзыв. Я добавил некоторую контекстную информацию, чтобы упростить ее даже при употреблении кофеина с низким содержанием кофеина ;-)
chaami
1
@ Лара, спасибо за сигнализацию, я не уделил пристального внимания при редактировании. Кажется, StackOverflow теперь более требователен к синтаксису блоков и теперь требует новой строки перед началом кода.
chaami
21

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

У меня были небольшие проблемы с его использованием, и я продолжал получать красное диалоговое окно с сообщением об ошибке «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
Если вы хотите использовать это для подписи драйверов, вам необходимо импортировать сертификат CA в хранилище компьютеров. Мой пример импортирует его в пользовательское хранилище, что подходит для большинства программ для тестирования / внутренних целей.
Роджер Липскомб
20

Это довольно просто с помощью команды New-SelfSignedCertificate в Powershell. Откройте PowerShell и выполните эти 3 команды.

1) Создать сертификат :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type 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: \ selfsigncert.pfx" -Password $ CertPassword

Ваш сертификат selfsigncert.pfx будет расположен @D:/


Необязательный шаг: вам также потребуется добавить пароль сертификата в системные переменные среды. сделать это, введя ниже в cmd:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
источник
JerryGoyal Знаете ли вы, как преобразовать самозаверяющий сертификат в CA Root Trusted Certificate?
Мистер
12

Начиная с PowerShell 4.0 (Windows 8.1 / Server 2012 R2) в Windows можно создать сертификат без makecert.exe .

Вам нужны следующие команды: New-SelfSignedCertificate и Export-PfxCertificate .

Инструкции приведены в разделе Создание самозаверяющих сертификатов с помощью PowerShell .

Ишай
источник
3
Стоит отметить, что даже если вы установите обновление WMF для получения PowerShell 4.0 в Windows 7, у вас не будет доступа к этой команде. Вроде бы Win8 или Server 2012 или новее.
Даниэль Янковский