Wie erstelle ich ein selbstsigniertes Zertifikat für die Codesignatur unter Windows?

Antworten:

363

Aktualisierte Antwort

Wenn Sie die folgenden Windows-Versionen oder höher verwenden: Windows Server 2012, Windows Server 2012 R2 oder Windows 8.1, ist MakeCert jetzt veraltet , und Microsoft empfiehlt die Verwendung des PowerShell-Cmdlets New-SelfSignedCertificate .

Wenn Sie eine ältere Version wie Windows 7 verwenden, müssen Sie sich an MakeCert oder eine andere Lösung halten. Einige Leute schlagen das PSPKI-Modul (Public Key Infrastructure Powershell) vor .

Ursprüngliche Antwort

Sie können zwar auf einmal ein selbstsigniertes Codesignaturzertifikat (SPC - Software Publisher Certificate ) erstellen , ich bevorzuge jedoch Folgendes:

Erstellen einer selbstsignierten Zertifizierungsstelle (CA)

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

(^ = Batch-Befehlszeile zum Zeilenumbruch zulassen)

Dadurch wird ein selbstsigniertes (-r) Zertifikat mit einem exportierbaren privaten Schlüssel (-pe) erstellt. Es heißt "Meine Zertifizierungsstelle" und sollte für den aktuellen Benutzer im Zertifizierungsstellenspeicher abgelegt werden. Wir verwenden den SHA-256- Algorithmus. Der Schlüssel ist zum Signieren gedacht (-sky).

Der private Schlüssel sollte in der Datei MyCA.pvk und das Zertifikat in der Datei MyCA.cer gespeichert sein.

CA-Zertifikat importieren

Da es keinen Sinn macht, ein CA-Zertifikat zu haben, wenn Sie ihm nicht vertrauen, müssen Sie es in den Windows-Zertifikatspeicher importieren. Sie können das MMC-Snapin "Zertifikate" verwenden, jedoch über die Befehlszeile:

certutil -user -addstore Root MyCA.cer

Erstellen eines Codesignaturzertifikats (SPC)

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

Es ist so ziemlich das gleiche wie oben, aber wir stellen einen Ausstellerschlüssel und ein Zertifikat bereit (die Schalter -ic und -iv).

Wir möchten auch das Zertifikat und den Schlüssel in eine PFX-Datei konvertieren:

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

Wenn Sie die PFX-Datei schützen möchten, fügen Sie den Schalter -po hinzu. Andernfalls erstellt PVK2PFX eine PFX-Datei ohne Passphrase.

Verwenden des Zertifikats zum Signieren des Codes

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

( Sehen Sie, warum Zeitstempel wichtig sein können )

Wenn Sie die PFX-Datei in den Zertifikatspeicher importieren (Sie können PVKIMPRT oder das MMC-Snapin verwenden), können Sie den Code wie folgt signieren:

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

Einige mögliche Zeitstempel-URLs für signtool /tsind:

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

Vollständige Microsoft-Dokumentation

Downloads

Für diejenigen, die keine .NET-Entwickler sind, benötigen Sie eine Kopie des Windows SDK- und .NET-Frameworks. Ein aktueller Link ist hier verfügbar: SDK & .NET (das makecert installiert C:\Program Files\Microsoft SDKs\Windows\v7.1). Ihr Kilometerstand kann variieren.

MakeCert ist über die Visual Studio-Eingabeaufforderung verfügbar. Visual Studio 2015 hat es und kann über das Startmenü in Windows 7 unter "Eingabeaufforderung für Entwickler für VS 2015" oder "Eingabeaufforderung für VS2015 x64 Native Tools" (wahrscheinlich alle im selben Ordner) gestartet werden.

Roger Lipscombe
quelle
Gibt es eine Möglichkeit, das E-Mail-Adressfeld des Zertifikats mit dieser Methode auszufüllen? Klicken Sie mit der rechten Maustaste auf exe> Eigenschaften> Digitale Signaturen. Nach dem Signieren wird E-Mail als "nicht verfügbar" angezeigt.
Cronoklee
Wenn Sie "zu viele Parameter" -Fehler erhalten, überprüfen Sie, ob Sie nicht versehentlich einen der Bindestriche bearbeitet haben. Andernfalls - geben Sie die Bindestriche erneut ein - kopieren Sie nicht das Einfügen.
Fiat
8
@cronoklee Um das E-Mail-Feld des Zertifikats zu füllen, fügen Sie einfach hinzu E=your@email. ZB:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W
1
-eku 1.3.6.1.5.5.7.3.3Benötigen Sie nicht das Schlüsselflag "Erweiterte Verwendung", damit das Zertifikat für die Codesignatur verwendet werden kann (ich weiß, dass Powershell keine Skripte signiert, wenn es fehlt)
Scott Chamberlain,
1
@AdamPhelps, Windows "lernt" nicht, Ihrem Zertifikat zu vertrauen. Ihre Benutzer müssen das CA-Zertifikat im Stammspeicher installieren. Dies ist im Allgemeinen eine schlechte Idee (da Stammzertifizierungsstellenzertifikate für schändliche Zwecke verwendet werden können). Es kann sinnvoll in einem Unternehmen Szenario machen, though.
Roger Lipscombe
36

Wie in der Antwort angegeben, sollte New-SelfSignedCertificate verwendet werden, um Ihr eigenes Skript auf nicht veraltete Weise zu signieren .

  1. Generieren Sie den Schlüssel:
New-SelfSignedCertificate -DnsName [email protected] -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. Exportieren Sie das Zertifikat ohne den privaten Schlüssel:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

Mit [0] funktioniert dies in Fällen, in denen Sie mehr als ein Zertifikat haben ... Stellen Sie sicher, dass der Index mit dem Zertifikat übereinstimmt, das Sie verwenden möchten ... oder filtern Sie (nach Thumprint oder Aussteller).

  1. Importieren Sie es als Trusted Publisher
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. Importieren Sie es als Root-Zertifizierungsstelle.
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. Signieren Sie das Skript (vorausgesetzt, es heißt hier script.ps1, korrigieren Sie den Pfad entsprechend).
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

Sobald Sie den Schlüssel eingerichtet haben, können Sie natürlich auch andere Skripte damit signieren.
In diesem Artikel finden Sie detailliertere Informationen und Hilfe zur Fehlerbehebung .

Chaami
quelle
Danke für diesen einen. Ich hätte zuerst von unten anfangen sollen!
mdiehl13
Danke dir. Dies löste alle meine Probleme, als ich versuchte, diesen "scheinbar einfachen" Prozess zum Laufen zu bringen.
Dave
1
Ich habe einen Fehler bei "2" erhalten. Aufgrund der (get-ChildItem ...)Rückgabe von mehr als einem Zertifikat habe ich am Ende "[0]" gesetzt und es hat funktioniert. Wie inExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
Lundman
1
@Lara danke für das Feedback Ich habe einige Kontextinformationen hinzugefügt, um es einfacher zu machen, selbst wenn ich wenig Koffein
probiere ;-)
1
@Lara danke für die Signalisierung, ich hatte beim Bearbeiten nicht genau aufgepasst. Es scheint, dass StackOverflow jetzt wählerischer in Bezug auf die Syntax der Blöcke ist und jetzt eine neue Zeile vor dem Beginn des Codes benötigt.
Chaami
21

Rogers Antwort war sehr hilfreich.

Ich hatte jedoch ein kleines Problem damit und bekam immer wieder das rote Fehlerdialogfeld "Windows kann den Herausgeber dieser Treibersoftware nicht überprüfen". Der Schlüssel war, das Teststammzertifikat mit zu installieren

certutil -addstore Root Demo_CA.cer

was Rogers Antwort nicht ganz abdeckte.

Hier ist eine Batch-Datei, die für mich funktioniert hat (mit meiner .inf-Datei, nicht enthalten). Es zeigt, wie alles von Anfang bis Ende ohne GUI-Tools ausgeführt wird (mit Ausnahme einiger Kennwortabfragen).

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
quelle
4
Wenn Sie dies zum Signieren von Treibern verwenden möchten, müssen Sie das CA-Zertifikat in den Computerspeicher importieren. In meinem Beispiel wird es zu Test- / internen Zwecken in den Benutzerspeicher importiert, was für die meisten Programme in Ordnung ist.
Roger Lipscombe
20

Mit dem Befehl New-SelfSignedCertificate in Powershell ist das ziemlich einfach . Öffnen Sie die Powershell und führen Sie diese 3 Befehle aus.

1) Zertifikat erstellen :
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert: \ CurrentUser \ My

2) Legen Sie das Passwort dafür fest :
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

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

Ihr Zertifikat selfsigncert.pfx befindet sich @D:/


Optionaler Schritt: Sie müssten außerdem Systemumgebungsvariablen ein Zertifikatkennwort hinzufügen. Geben Sie dazu unten in cmd Folgendes ein:setx CSC_KEY_PASSWORD "my_password"

JerryGoyal
quelle
JerryGoyal wissen Sie, wie Sie ein selbstsigniertes Zertifikat in ein CA Root Trusted Certificate konvertieren?
Herr Heelis
12

Ab PowerShell 4.0 (Windows 8.1 / Server 2012 R2) ist es möglich, ein Zertifikat in Windows ohne makecert.exe zu erstellen .

Die Befehle, die Sie benötigen, sind New-SelfSignedCertificate und Export-PfxCertificate .

Anweisungen finden Sie unter Erstellen selbstsignierter Zertifikate mit PowerShell .

Yishai
quelle
3
Es ist erwähnenswert, dass Sie selbst dann keinen Zugriff auf diesen Befehl haben, wenn Sie das WMF-Update installieren, um PowerShell 4.0 unter Windows 7 zu erhalten. Es scheint Win8 oder Server 2012 oder höher zu sein.
Daniel Yankowsky