Как создать самозаверяющий сертификат для подписи кода с помощью инструментов из Windows SDK?
Как создать самозаверяющий сертификат для подписи кода с помощью инструментов из Windows SDK?
Ответы:
Если вы используете следующие версии 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, если вы ему не доверяете, вам необходимо импортировать его в хранилище сертификатов Windows. Вы можете использовать оснастку MMC Certificates, но из командной строки:
certutil -user -addstore Root MyCA.cer
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
Для тех, кто не является разработчиком .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» (возможно, все они находятся в одной папке).
E=your@email
. Например:makecert -pe -n "CN=My SPC,E=email@domain" ........
-eku 1.3.6.1.5.5.7.3.3
чтобы сертификат можно было использовать для подписи кода (я знаю, что powershell не сможет подписать сценарии, если он его пропустит)
Как указано в ответе, чтобы использовать неосмотрительный способ подписи собственного сценария, следует использовать New-SelfSignedCertificate .
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
[0] сделает эту работу для случаев, когда у вас более одного сертификата ... Очевидно, что индекс будет соответствовать сертификату, который вы хотите использовать ... или используйте способ фильтрации (по thumprint или эмитенту).
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)
Очевидно, что после того, как вы настроили ключ, вы можете просто подписать любые другие сценарии с ним.
В этой статье вы можете получить более подробную информацию и помощь в устранении неполадок .
(get-ChildItem ...)
возврата более одного сертификата, поэтому я поставил «[0]» в конце, и это сработало. Как вExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
Ответ Роджера был очень полезным.
У меня были небольшие проблемы с его использованием, и я продолжал получать красное диалоговое окно с сообщением об ошибке «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
Это довольно просто с помощью команды New-SelfSignedCertificate в Powershell. Откройте PowerShell и выполните эти 3 команды.
1) Создать сертификат :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My2) установите для него пароль :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText3) Экспортируйте его :
Export-PfxCertificate -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword
Ваш сертификат selfsigncert.pfx будет расположен @D:/
Необязательный шаг: вам также потребуется добавить пароль сертификата в системные переменные среды. сделать это, введя ниже в cmd:setx CSC_KEY_PASSWORD "my_password"
Начиная с PowerShell 4.0 (Windows 8.1 / Server 2012 R2) в Windows можно создать сертификат без makecert.exe .
Вам нужны следующие команды: New-SelfSignedCertificate и Export-PfxCertificate .
Инструкции приведены в разделе Создание самозаверяющих сертификатов с помощью PowerShell .