Jak utworzyć samopodpisany certyfikat do podpisywania kodu przy użyciu narzędzi z zestawu Windows SDK?
Jak utworzyć samopodpisany certyfikat do podpisywania kodu przy użyciu narzędzi z zestawu Windows SDK?
Odpowiedzi:
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 .
Chociaż możesz utworzyć samopodpisany certyfikat podpisujący kod (SPC - Software Publisher Certificate ) za jednym razem, wolę wykonać następujące czynności:
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.
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
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.
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
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).
E=your@email
. Np .:makecert -pe -n "CN=My SPC,E=email@domain" ........
-eku 1.3.6.1.5.5.7.3.3
aby certyfikat mógł być używany do podpisywania kodu (wiem, że PowerShell nie podpisuje skryptów, jeśli go brakuje)
Jak stwierdzono w odpowiedzi, aby użyć nieaktualnego sposobu podpisywania własnego skryptu, należy użyć 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] 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).
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)
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 .
(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
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
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 \ My2) ustaw dla niego hasło :
$ CertPassword = ConvertTo-SecureString -String „my_passowrd” -Force –AsPlainText3) 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"
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 .