Signtool erlaubt mir, Code zu signieren, aber Set-AuthenticodeSignature sagt das "Zertifikat ist nicht für Code-Signaturen geeignet"

8

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.

    
Scott Chamberlain 07.06.2012, 17:47
quelle

3 Antworten

6

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%     
Arpit Chauhan 03.09.2013, 03:42
quelle
3

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%     
JPBlanc 07.06.2012 20:18
quelle
0

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.

  • Jeder, der ein Signaturzertifikat benötigt, hat wahrscheinlich einen Router mit einem Web-Admin, vielleicht einen NAS mit einem Web-Admin, einem VPN-Server usw., die alle SSL-Zertifikate für die TLS-Verschlüsselung haben sollten.
    • Am besten erstellen Sie eine zentrale selbstsignierte CA mit 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.
    • Es ist am einfachsten, einfach die neueste Version des OpenVPN-Clients (https: // openvpn.net/index.php/open-source/downloads.html) zu installieren, von dem openssl-utils enthalten ist
      • Zu PFAD hinzufügen: C:\Program Files\OpenVPN\bin
  • Mein GitHub hat eine vorgefertigte openssl.cnf mit dem Informationsteil , die alle erforderlichen Befehle enthält, beginnend in Zeile 430
    • Die Erstellung der CA erfordert zwei Befehle (create & amp; export to PKCS12)
    • Die ICA-Erstellung erfordert 3 Befehle (Erstellen, Signieren und Exportieren nach PKCS12)
    • Signing Cert benötigt 3 Befehle (create, sign, & amp; export to PKCS12)
      • Der Abschnitt Clientzertifikate wird für die Signierung von Zertifikaten verwendet

OpenSSL KUs & amp; EKUs

Code signing certs sollte folgenden Satz haben:

  • keyUsage = critical, nonRepudiation, digitalSignature

    • nonRepudiation
      • Das Zertifikat kann verwendet werden, um Daten wie oben zu signieren, aber der öffentliche Schlüssel des Zertifikats kann verwendet werden, um Nicht-Abstreitungsdienste bereitzustellen
      • Dies verhindert, dass die signierende Entität fälschlicherweise eine Aktion verweigert
    • digitalSignature
      • Das Zertifikat kann zum Anwenden einer digitalen Signatur verwendet werden
      • Digitale Signaturen werden häufig für Entitätsauthentifizierung verwendet & amp; Authentifizierung der Datenherkunft mit Integrität
  • extendedKeyUsage = critical, codeSigning, msCodeInd, msCodeCom, mcCTLSign, timeStamping

    • codeSigning
      • Codesignierung
    • msCodeInd
      • Microsoft Individualcode-Signierung (Authenticode)
    • msCodeCom
      • Microsoft Commercial-Code-Signierung (Authenticode)
    • mcCTLSign
      • Microsoft-Vertrauenslisten-Signierung
    • timeStamping
      • Trusted Timestamping

Zeichenwerkzeug

Vorschreibungen:

  1. Installieren Sie Windows SDK
  2. Navigieren Sie zu: Systemsteuerung \ Alle Elemente der Systemsteuerung \ System & gt; Erweiterte Systemeinstellungen & gt; Umgebungsvariablen ... & gt; Pfad & gt; Bearbeiten ...
  3. Fügen Sie dem Pfad Folgendes hinzu:
    • %Code%
      • Stellen Sie sicher, dass C:\Program Files (x86)\Windows Kits\bin.0.15063.0\x64 den richtigen Pfad für Ihren PC angibt

Befehle:

  1. %Code%
    • Erstellt die Variable \bin.0.15063.0\x64 für den folgenden Befehl
  2. %Code%
    • set TS=http://sha256timestamp.ws.symantec.com/sha256/timestamp
      • Dateien mit einer eingebetteten Signatur signieren
    • %TS% signtool sign /s my /fd SHA256 /ph /td SHA256 /tr %TS1% "Path\to\File"
      • Geben Sie den Shop an, der beim Suchen nach dem Zertifikat geöffnet werden soll. Der Standard ist der "MY" Store.
    • sign
      • Gibt den Dateiauszugsalgorithmus an, der zum Erstellen von Dateisignaturen verwendet werden soll. (Standard ist SHA1)
    • /s
      • Generieren Sie Seitenhashes für ausführbare Dateien, falls sie unterstützt werden.
    • <name> /fd
      • * Wird mit der Option /ph oder / tseal verwendet, um einen Digest-Algorithmus anzufordern, der vom RFC 3161-Zeitstempelserver verwendet wird. *
    • /td <alg>
      • Gibt die URL des RFC 3161-Zeitstempels an. Wenn diese Option (oder /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.

PowerShell

  1. %Code%
    • Erstellt die Variable <URL> für den folgenden Befehl
  2. %Code%
    • Erstellt die Variable /t für den folgenden Befehl
  3. %Code%
    • /t
      • Fügt einem Windows PowerShell-Skript oder einer anderen Datei eine Authenticode-Signatur hinzu.
    • $Cert = Get-PfxCertificate -FilePath "Path\to\Signing\Cert"
      • Gibt den Hash-Algorithmus an, der zum Berechnen der digitalen Signatur verwendet wird.
        • PS 2.0: Der Standard-Hash-Algorithmus von Windows ist SHA1.
        • PS 3.0: Der Standard-Hashing-Algorithmus von Windows ist SHA256.
    • $Cert Set-Variable -Name TS -Value "http://sha256timestamp.ws.symantec.com/sha256/timestamp" -Scope "Global"
      • Legt fest, welche Zertifikate in der Vertrauenskette des Zertifikats in der digitalen Signatur enthalten sind. $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>
      • Gibt das Zertifikat an, das zum Signieren des Skripts oder der Datei verwendet wird. Geben Sie eine Variable ein, die ein Objekt speichert, das das Zertifikat darstellt, oder einen Ausdruck, der das Zertifikat abruft.
      • Um ein Zertifikat zu finden, verwenden Sie 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.
JW0914 12.10.2017 15:52
quelle