Ist es möglich, den Betreff des digitalen Zertifikats einer Datei irgendwie programmgesteuert zu exportieren, wenn das Zertifikat selbst nicht auf der Arbeitsstation installiert ist, sondern nur zum Signieren dieser bestimmten Datei verwendet wird?
Ich muss diese Informationen irgendwie aus einer Datei extrahieren und prüfen, ob sie korrekt sind. Am besten mit Python/CMD/PowerShell
BEARBEITEN:
Entschuldigen Sie den Mangel an Einzelheiten.
Ich verwende derzeit dieses Python-Skript (das ich für die Ausführung unter Python 3.6 geändert habe):http://www.zedwood.com/article/python-openssl-x509-parse-certificateum eine .cer-Datei zu analysieren, die ich mit diesem kleinen Tool, das ich gefunden habe (und das ich auch für die Verwendung mit Python 3 geändert habe), aus der ursprünglichen ausführbaren Datei extrahiert habe:https://blog.didierstevens.com/programs/disitool/aber erst, nachdem ich es mit dem Windows Certutil von einer DER-codierten Binärdatei in eine Base-64-Datei konvertiere.
Das Problem mit dem Disitool-Skript besteht jedoch darin, dass es mithilfe des Python-Moduls „pefile“ buchstäblich ein „Signatur“-Bytearray aus der ausführbaren Datei selbst AUSSCHNEIDET, wodurch die extrahierte CER-Datei ungültig wird, entsprechend dem Python-Fehler, den ich immer erhalte, wenn ich versuche, das Zertifikat mit dem Modul OpenSSL.crypto zu laden:
[('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error'), ('asn1 encoding routines', 'asn1_template_noexp_d2i', 'nested asn1 error'), ('PEM routines', 'PEM_ASN1_read_bio', 'ASN1 lib')]
Aber das Parsen eines guten extrahierten Zertifikats (mit dem ersten Skript, das ich oben gepostet habe) funktioniert, wie Sie hier sehen können:
Ich brauche also wohl nur eine Möglichkeit, das Zertifikat aus einer ausführbaren Datei zu extrahieren. Oder, falls Sie meine Lösung zu kompliziert finden: Wenn Sie eine Idee haben, wie ich den Text „Redmond“ aus dem Betrefffeld des Zertifikats herausbekomme, bin ich sehr offen für Ideen :)
Antwort1
In Powershell:
Get-AuthenticodeSignature C:\Path\TO\File.exe
Wenn wir also Ihr Beispiel von explorer.exe verwenden, käme Redmond zu folgendem Ergebnis:
(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split(',')[2].split('=')[1]
Da Sie um eine genauere Erläuterung gebeten haben, Get-AuthenticodeSignature
gibt es ein System.Management.Automation.Signature-Objekt zurück. Sie können dies auf verschiedene Weise herausfinden. Persönlich ziehe ich es vor, es einer Variablen zuzuweisen, damit ich mit dem zurückgegebenen Objekt weiter herumspielen kann. Sobald Sie es einer Variablen zugewiesen haben, können Sie etwas darüber lernen. Get-Member
sollte eines Ihrer bevorzugten Cmdlets in Powershell sein. In diesem Fall:
$foo = Get-AuthenticodeSignature C:\Windows\explorer.exe
Get-Member -InputObject $foo
TypeName: System.Management.Automation.Signature
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
IsOSBinary Property bool IsOSBinary {get;}
Path Property string Path {get;}
SignatureType Property System.Management.Automation.SignatureType SignatureType {get;}
SignerCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {...
Status Property System.Management.Automation.SignatureStatus Status {get;}
StatusMessage Property string StatusMessage {get;}
TimeStamperCertificate Property System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific...
Sie können also sehen, dass das Objekt einige Methoden und Eigenschaften hat (ich weiß, das haben alle Objekte). In diesem Fall sind alle Methoden die Standardmethoden, die von System.Object geerbt werden. Die Eigenschaften sind jedoch interessant. Das SignerCertificate sieht so aus, wie Sie es wollten, also sehen wir uns an, wie es aussieht:
$foo.SignerCertificate
Thumbprint Subject
---------- -------
419E77AED546A1A6CF4DC23C1F977542FE289CF7 CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Der Daumenabdruck ist offensichtlich wichtig, da er das Zertifikat identifiziert, aber Sie hatten nach dem Redmond gefragt, der im Betreff steht. Jetzt wissen wir also, wie wir ihn als Zeichenfolge erhalten:
$foo.SignerCertificate.Subject
Von hier an handelt es sich also nur noch um eine direkte Zeichenfolgenanalyse.
Noch ein kleiner Tipp, den ich einwerfen möchte, da Sie anscheinend Powershell lernen. Ein weiteres Cmdlet, das Sie regelmäßig ausprobieren sollten, ist Get-Command. In diesem Fall wusste ich nicht einmal, dass das Cmdlet Get-AuthenticodeSignature existiert, bevor Sie die Frage gestellt haben. Also habe ich Folgendes gemacht:
Get-Command *signature*
CommandType Name Version Source
----------- ---- ------- ------
Function Update-MpSignature 1.0 Defender
Cmdlet Get-AuthenticodeSignature 3.0.0.0 Microsoft.PowerShell.Security
Cmdlet Save-VolumeSignatureCatalog 1.0.0.0 ShieldedVMDataFile
Cmdlet Set-AuthenticodeSignature 3.0.0.0 Microsoft.PowerShell.Security
Antwort2
in Powershell: Sie können in CN ein Komma verwenden, dann hat das bei mir funktioniert:
(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split('=')[1].split('"=')[1]