Jak utworzyć samopodpisany certyfikat do podpisywania kodu w systemie Windows?

Odpowiedzi:

363

Zaktualizowana odpowiedź

Jeśli korzystasz z następujących wersji systemu Windows lub nowszej: Windows Server 2012, Windows Server 2012 R2 lub Windows 8.1, MakeCert jest teraz przestarzały , a Microsoft zaleca korzystanie z polecenia PowerShell Cmdlet New-SelfSignedCertificate .

Jeśli używasz starszej wersji, takiej jak Windows 7, musisz trzymać się MakeCert lub innego rozwiązania. Niektórzy wskazują na infrastrukturze klucza publicznego PowerShell (PSPKI) Module .

Oryginalna odpowiedź

Chociaż możesz utworzyć samopodpisany certyfikat podpisujący kod (SPC - Software Publisher Certificate ) za jednym razem, wolę wykonać następujące czynności:

Tworzenie samopodpisanego urzędu certyfikacji (CA)

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

(^ = zezwól, aby wiersz polecenia wsadowego zawinął wiersz)

To tworzy samopodpisany certyfikat (-r) z eksportowalnym kluczem prywatnym (-pe). Nazywa się „Mój urząd certyfikacji” i należy go umieścić w sklepie urzędu certyfikacji dla bieżącego użytkownika. Używamy algorytmu SHA-256 . Klucz służy do podpisywania (-sky).

Klucz prywatny powinien być przechowywany w pliku MyCA.pvk, a certyfikat w pliku MyCA.cer.

Importowanie certyfikatu CA

Ponieważ nie ma sensu mieć certyfikatu CA, jeśli mu nie ufasz, musisz zaimportować go do magazynu certyfikatów Windows. Państwo może użyć przystawki MMC Certyfikaty, ale z linii poleceń:

certutil -user -addstore Root MyCA.cer

Tworzenie certyfikatu do podpisywania kodu (SPC)

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

Jest prawie taki sam jak powyżej, ale zapewniamy klucz wystawcy i certyfikat (przełączniki -ic i -iv).

Będziemy również chcieli przekonwertować certyfikat i klucz do pliku PFX:

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

Jeśli chcesz chronić plik PFX, dodaj przełącznik -po, w przeciwnym razie PVK2PFX utworzy plik PFX bez hasła.

Korzystanie z certyfikatu do podpisywania kodu

signtool sign /v /f MySPC.pfx ^
              /t http://timestamp.url MyExecutable.exe

( Zobacz, dlaczego znaczniki czasu mogą mieć znaczenie )

Jeśli importujesz plik PFX do magazynu certyfikatów (możesz użyć PVKIMPRT lub przystawki MMC), możesz podpisać kod w następujący sposób:

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

Niektóre możliwe adresy URL znaczników czasu dla signtool /t:

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

Pełna dokumentacja Microsoft

Pliki do pobrania

Dla tych, którzy nie są programistami .NET, potrzebujesz kopii zestawu Windows SDK i .NET Framework. Aktualny link jest dostępny tutaj: SDK i .NET (który instaluje makecert w C:\Program Files\Microsoft SDKs\Windows\v7.1). Twój przebieg może się różnić.

MakeCert jest dostępny z wiersza polecenia programu Visual Studio. Program Visual Studio 2015 ma go i można go uruchomić z menu Start w systemie Windows 7 pod „Wiersz polecenia programisty dla VS 2015” lub „Wiersz polecenia narzędzia macierzystego VS2015 x64” (prawdopodobnie wszystkie w tym samym folderze).

Roger Lipscombe
źródło
Czy można w ten sposób wypełnić pole adresu e-mail certyfikatu? Kliknij prawym przyciskiem myszy exe> właściwości> podpisy cyfrowe po podpisaniu wyświetla wiadomość e-mail jako „niedostępną”.
cronoklee
Jeśli wystąpią błędy „zbyt wielu parametrów”, sprawdź, czy przypadkowo nie edytowałeś łącznika. W przeciwnym razie - wpisz ponownie łączniki - nie kopiuj wklejania.
piątek
8
@cronoklee Aby wypełnić pole e-mail certyfikatu, wystarczy dodać E=your@email. Np .:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W
1
Nie potrzebujesz flagi klucza Rozszerzone użycie, -eku 1.3.6.1.5.5.7.3.3aby certyfikat mógł być używany do podpisywania kodu (wiem, że PowerShell nie podpisuje skryptów, jeśli go brakuje)
Scott Chamberlain
1
@AdamPhelps, system Windows nie „nauczy się” ufać certyfikatowi. Użytkownicy muszą zainstalować certyfikat CA w sklepie Root. Jest to ogólnie zły pomysł (ponieważ certyfikatów głównego urzędu certyfikacji można używać do niecnych celów). Może to jednak mieć sens w scenariuszu korporacyjnym.
Roger Lipscombe,
36

Jak stwierdzono w odpowiedzi, aby użyć nieaktualnego sposobu podpisywania własnego skryptu, należy użyć New-SelfSignedCertificate .

  1. Wygeneruj klucz:
New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Wyeksportuj certyfikat bez klucza prywatnego:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0] sprawi, że będzie to działać w przypadkach, gdy masz więcej niż jeden certyfikat ... Oczywiście dopasuj indeks do certyfikatu, którego chcesz użyć ... lub użyj metody filtrowania (według odcisków lub wystawców).

  1. Zaimportuj go jako zaufanego wydawcę
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Zaimportuj jako główny urząd certyfikacji.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Podpisz skrypt (zakładając, że nazywa się script.ps1, odpowiednio napraw ścieżkę).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Oczywiście po skonfigurowaniu klucza możesz po prostu podpisać nim inne skrypty.
Więcej szczegółowych informacji i pomoc w rozwiązywaniu problemów można znaleźć w tym artykule .

chaami
źródło
Dzięki za to. Najpierw powinienem zacząć od odpowiedzi na dole!
mdiehl13
Dziękuję Ci. To rozwiązało wszystkie moje problemy związane z próbą uruchomienia tego „pozornie prostego” procesu.
Dave
1
Wystąpił błąd „2” ze względu na (get-ChildItem ...)zwrot więcej niż jednego certyfikatu, więc umieściłem „[0]” na końcu i zadziałało. Jak wExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
lundman
1
@ Lara dziękuję za opinie. Dodałem informacje kontekstowe, aby ułatwić nawet przy niskiej zawartości kofeiny ;-)
chaami
1
@ Lara, dziękuję za sygnalizację, podczas edytowania nie zwracałem szczególnej uwagi. Wygląda na to, że StackOverflow jest teraz bardziej wybredny w kwestii składni bloków i teraz wymaga nowego wiersza przed rozpoczęciem kodu.
chaami
21

Odpowiedź Rogera była bardzo pomocna.

Miałem jednak trochę problemów z korzystaniem z niego i ciągle pojawiało się czerwone okno dialogowe błędu „Windows nie może zweryfikować wydawcy tego sterownika”. Kluczem było zainstalowanie testowego certyfikatu głównego za pomocą

certutil -addstore Root Demo_CA.cer

którego odpowiedź Rogera nie do końca obejmowała.

Oto plik wsadowy, który działał dla mnie (z moim plikiem .inf, nie dołączonym). Pokazuje, jak to zrobić od początku do końca, bez żadnych narzędzi GUI (z wyjątkiem kilku monitów o hasło).

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
Dan Kegel
źródło
4
Jeśli chcesz użyć tego do podpisywania sterowników, musisz zaimportować certyfikat CA do magazynu maszyn. Mój przykład importuje go do sklepu użytkownika, który jest odpowiedni dla większości programów, do celów testowych / wewnętrznych.
Roger Lipscombe,
20

Korzystanie z polecenia New-SelfSignedCertificate w programie Powershell jest dość łatwe . Otwórz PowerShell i uruchom te 3 polecenia.

1) Utwórz certyfikat :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) ustaw dla niego hasło :
$ CertPassword = ConvertTo-SecureString -String „my_passowrd” -Force –AsPlainText

3) Eksportuj :
Export-PfxCertificate -Cert "cert: \ CurrentUser \ My \ $ ($ cert.Thumbprint)" -FilePath "d: \ selfsigncert.pfx" -Password $ CertPassword

Twój certyfikat selfsigncert.pfx będzie znajdować się @D:/


Krok opcjonalny: Wymagane będzie również dodanie hasła certyfikatu do zmiennych środowiskowych systemu. zrób to wpisując poniżej w cmd:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
źródło
JerryGoyal, czy wiesz, jak przekonwertować samopodpisany certyfikat na główny zaufany certyfikat CA?
Pan Heelis
12

Począwszy od programu PowerShell 4.0 (Windows 8.1 / Server 2012 R2) można utworzyć certyfikat w systemie Windows bez makecert.exe .

Potrzebne polecenia to New-SelfSignedCertificate i Export-PfxCertificate .

Instrukcje dotyczą tworzenia certyfikatów z podpisem własnym za pomocą programu PowerShell .

Yishai
źródło
3
Warto wspomnieć, że nawet jeśli zainstalujesz aktualizację WMF, aby uzyskać PowerShell 4.0 na Windows 7, nie będziesz mieć dostępu do tego polecenia. Wygląda na to, że jest to Win8 lub Server 2012 lub nowszy.
Daniel Yankowsky