Как создать самозаверяющий сертификат для подписи кода в Windows?
Как создать самозаверяющий сертификат для подписи кода с помощью инструментов из Windows SDK?
7 ответов
Обновленный ответ
Если вы используете следующие версии 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" (возможно, все они находятся в одной папке).
Как указано в ответе, для того, чтобы подписать свой собственный сценарий не рекомендуется, нужно использовать 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)
Очевидно, что после того, как вы настроили ключ, вы можете просто подписать любые другие сценарии с ним.
В этой статье вы можете получить более подробную информацию и помощь в устранении неполадок.
Это довольно легко с помощью команды 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"
Ответ Роджера был очень полезным.
У меня были небольшие проблемы с его использованием, и я продолжал получать красный диалог "Windows не может проверить издателя этого драйвера". Ключ должен был установить тестовый корневой сертификат с
certutil -addstore Root Demo_CA.cer
который ответ Роджера не совсем охватывает.
Вот пакетный файл, который работал для меня (с моим.inf файлом, не включенным). Он показывает, как сделать все это от начала до конца, без инструментов графического интерфейса вообще (за исключением нескольких запросов пароля).
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
Начиная с PowerShell 4.0 (Windows 8.1 / Server 2012 R2) в Windows можно создать сертификат без makecert.exe.
Вам нужны следующие команды: New-SelfSignedCertificate и Export-PfxCertificate.
Инструкции приведены в разделе "Создание самоподписанных сертификатов с помощью PowerShell".
Вы можете создать его в Visual Studio 2019 в свойствах проекта. В разделе «Подписание драйвера» в поле «Сертификат тестирования» есть раскрывающийся список. Один из вариантов - создание тестового сертификата. Сертификат будет в файле с расширением cer, как правило, в том же выходном каталоге, что и ваш исполняемый файл или драйвер.
Этот пост ответит только на часть «как спеть EXE-файл, если у вас есть crtificate»:
Для подписи exe-файла я использовал MS "signtool.exe". Для этого вам нужно будет загрузить раздутый MS Windows SDK, который имеет колоссальный размер 1 ГБ. К счастью, вам не нужно его устанавливать. Просто откройте ISO-образ и извлеките «Windows SDK Signing Tools-x86_en-us.msi». Он имеет всего 400 КБ.
Затем я создал этот крошечный файл сценария:
prompt $
echo off
cls
copy "my.exe" "my.bak.exe"
"c:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe" sign /fd SHA256 /f MyCertificate.pfx /p MyPassword My.exe
pause
__