Ich habe ein selbstsigniertes Codesignaturzertifikat (erstellt mit den Anweisungen aus dieser Antwort ) und es funktioniert gut wann Ich benutze signtool.exe
. Aber wenn ich versuche, es mit Powershell zu signieren, schlägt es fehl.
Unterzeichnung mit signtool
%Vor%Anmeldung bei Powershell
%Vor%Warum kann ich signtool.exe signieren, aber nicht Powershell?
P.S. Das Ausführen von Get-Childitem cert:\CurrentUser\My -CodeSigningCert
gibt keine Ergebnisse zurück.
Ich hatte das gleiche Problem und die Antwort, die ich herausfand, war, dass ich zwei Zertifikate erstellen musste . Zuerst eine vertrauenswürdige Stammzertifizierungsstelle, die
verwendet %Vor%Und dann ein persönliches Zertifikat von der oben genannten Zertifizierungsstelle mit
%Vor%Sobald diese erstellt sind, verwenden Sie
%Vor%zum Signieren (vorausgesetzt, Sie haben nur ein Zeichenzertifikat). Wenn der Name des Skripts beispielsweise "xyz.ps1" lautet, verwenden Sie diesen Befehl in PowerShell
%Vor% Nach get-help-Zertifikat -CodeSigningCert
dynamischer Parameter vom Zertifikatanbieter erhält nur diese Zertifikate mit Code-Signing-Berechtigung.
Nun, warum signtool
signieren kann und nicht Set-AuthenticodeSignature
, die Erklärung ist vielleicht in Einführung in die Code-Signierung Microsoft-Dokument.
Hier ist meine Version der Generation der Zertifizierungsstelle:
%Vor%Hier ist meine Version des Entwicklerzertifikats:
%Vor%Das Problem ist, dass das Signaturzertifikat fehlerhaft ist und die richtigen KUs & amp; EKUs. Ich empfehle persönlich, OpenSSL über eine openssl.cnf zu verwenden, um Zertifikate zu generieren.
openssl
über eine openssl.cnf und erstellen dann einen ICA für Code Signing (signiert von der selbstsignierten CA), der dann zur Signierung des Codes verwendet wird Zertifikat signieren. C:\Program Files\OpenVPN\bin
Code signing certs sollte folgenden Satz haben:
keyUsage = critical, nonRepudiation, digitalSignature
nonRepudiation
digitalSignature
extendedKeyUsage = critical, codeSigning, msCodeInd, msCodeCom, mcCTLSign, timeStamping
codeSigning
msCodeInd
msCodeCom
mcCTLSign
timeStamping
Vorschreibungen:
C:\Program Files (x86)\Windows Kits\bin.0.15063.0\x64
den richtigen Pfad für Ihren PC angibt Befehle:
\bin.0.15063.0\x64
für den folgenden Befehl set TS=http://sha256timestamp.ws.symantec.com/sha256/timestamp
%TS%
signtool sign /s my /fd SHA256 /ph /td SHA256 /tr %TS1% "Path\to\File"
sign
/s
<name>
/fd
/ph
oder / tseal verwendet, um einen Digest-Algorithmus anzufordern, der vom RFC 3161-Zeitstempelserver verwendet wird. * /td
<alg>
/tr
) nicht angegeben ist, wird die signierte Datei nicht mit einem Zeitstempel versehen. Wenn der Zeitstempel fehlschlägt, wird eine Warnung generiert. Dieser Schalter kann nicht mit dem Schalter /tr
verwendet werden. <URL>
für den folgenden Befehl /t
für den folgenden Befehl /t
$Cert = Get-PfxCertificate -FilePath "Path\to\Signing\Cert"
$Cert
Set-Variable -Name TS -Value "http://sha256timestamp.ws.symantec.com/sha256/timestamp" -Scope "Global"
$TS
ist der Standardwert. Die zulässigen Werte für diesen Parameter sind:
Set-AuthenticodeSignature -HashAlgorithm "sha256" -IncludeChain "all" -FilePath "File" -Certificate $Cert -TimestampServer $TS
: Enthält nur das Zertifikat des Unterzeichners.
Set-AuthenticodeSignature
: Enthält alle Zertifikate in der Zertifikatskette mit Ausnahme der Stammberechtigung.
-HashAlgorithm
: Beinhaltet alle Zertifikate in der Zertifikatskette.
-IncludeChain
<String>
NotRoot
oder verwenden Sie das Cmdlet Signer
im Zertifikat (Cert :) -Laufwerk. Wenn das Zertifikat nicht gültig ist oder keine Signaturautorität hat, schlägt der Befehl fehl. Tags und Links powershell code-signing signtool