Як створити самопідписаний сертифікат для підписання коду в Windows?


Відповіді:


363

Оновлений відповідь

Якщо ви використовуєте такі версії Windows або новіші версії: Windows Server 2012, Windows Server 2012 R2 або Windows 8.1, тепер MakeCert застарілий , і Microsoft рекомендує використовувати PowerShell Cmdlet 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", і його слід розмістити в магазині ЦС для поточного користувача. Ми використовуємо алгоритм SHA-256 . Ключ призначений для підпису (-sky).

Приватний ключ повинен зберігатися у файлі MyCA.pvk, а сертифікат - у файлі MyCA.cer.

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

Оскільки немає сенсу мати сертифікат 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 або 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 рамки. Поточне посилання доступне тут: 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" (можливо, всі вони знаходяться в одній папці).


Чи є спосіб заповнити поле електронної адреси сертифіката за допомогою цього методу? Клацніть правою кнопкою миші exe> властивості> цифрові підписи після підписання відображається електронна пошта як "недоступна".
кроноклі

Якщо ви отримуєте помилки "занадто багато параметрів", ви перевіряєте, чи не змінили ви один з дефісів випадково. Якщо цього не зробити - повторно введіть дефіси - не копіюйте пасту.
фіат

8
@cronoklee Щоб заповнити поле електронної пошти сертифіката, просто додайте E=your@email. Напр .:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
Чи не потрібен вам прапор ключа розширеного використання, -eku 1.3.6.1.5.5.7.3.3щоб cert можна було використовувати для підписання коду (я знаю, що powerhell не в змозі підписати сценарії, якщо його немає)
Scott Chamberlain

1
@AdamPhelps, Windows не "навчиться" довіряти вашому сертифікату. Ваші користувачі повинні встановити сертифікат CA в магазині Root. Це, загалом кажучи, погана ідея (адже кореневі сертифікати CA можуть використовуватися для нечесних цілей). Однак це може мати сенс для корпоративного сценарію.
Роджер Ліпскомб

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] зробить цю роботу для випадків, коли у вас є більше одного сертифіката ... Очевидно, щоб індекс відповідав сертифікату, який ви хочете використовувати ... або використовуєте спосіб фільтрації (за відбитком пальців або емітентом).

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

Очевидно, що після установки ключа, ви можете просто підписати з ним будь-які інші сценарії.
Ви можете отримати більш детальну інформацію та деяку допомогу щодо усунення несправностей у цій статті .


Дякую за це. Я мав би почати з нижньої відповіді спочатку!
mdiehl13

Дякую. Це вирішило усі мої проблеми, намагаючись змусити цей «начебто простий» процес працювати.
Дейв

1
Я отримав помилку на "2." завдяки (get-ChildItem ...)поверненню більше ніж одного cert, тому я поставив "[0]" в кінці, і це спрацювало. Як вExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
лундман

1
@Lara дякую за відгук Я додав інформацію про контекст, щоб полегшити її навіть при спробі
вживання

1
@Lara спасибі за сигналізацію, я не звертав пильної уваги під час редагування. Здається, StackOverflow тепер більш прискіпливий до синтаксису блоків і тепер вимагає нового рядка до початку коду.
chaami

21

Відповідь Роджера була дуже корисною.

Однак у мене виникли невеликі проблеми з його використанням, і я продовжував отримувати червоний діалог "Windows не може перевірити видавця цього програмного забезпечення драйвера" Ключовим моментом було встановити сертифікат root root

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 досить просто . Відкрийте панель повноважень та запустіть ці 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 Ви знаєте, як перетворити сертифікат, який підписався самостійно, у сертифікат кореневого сертифіката CA?
Містер Хеліс

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 або новіших версій.
Даніель Янковський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.