Как создать самозаверяющий сертификат для подписи кода в Windows? - PullRequest
201 голосов
/ 17 сентября 2008

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

Ответы [ 5 ]

340 голосов
/ 14 октября 2008

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

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

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

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

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

Создание самозаверяющего центра сертификации (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). Он называется «Мой ЦС» и должен быть помещен в хранилище ЦС для текущего пользователя. Мы используем алгоритм SHA-256 . Ключ предназначен для подписи (-ски).

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

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

Поскольку нет смысла иметь сертификат CA, если вы ему не доверяете, вам необходимо импортировать его в хранилище сертификатов Windows. Вы можете использовать оснастку 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 или оснастку MMC), вы можете подписать код следующим образом:

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

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

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

17 голосов
/ 16 апреля 2013

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

У меня были небольшие проблемы с его использованием, и я продолжал получать красный диалог ошибки «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
12 голосов
/ 06 ноября 2017

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

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

2) установить пароль для него :
$ CertPassword = ConvertTo-SecureString Строка "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"

12 голосов
/ 28 февраля 2016

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

Команды, которые вам нужны: New-SelfSignedCertificate и Export-PfxCertificate .

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

11 голосов
/ 20 июля 2018

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

  1. Генерация ключа:
    New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My

  2. Экспорт сертификата без закрытого ключа:
    Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt [0] выполнит эту работу для случаев, когда у вас более одного сертификата ... Очевидно, что индекс будет соответствовать сертификату, который вы хотите использовать ... или используйте способ фильтрации (по thumprint или эмитенту).

  3. Импортировать как надежный издатель
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher

  4. Импортируйте его как корневой центр сертификации.
    Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root

  5. Подпишите скрипт.
    Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...