以程式設計方式取得可執行檔的證書詳細信息

以程式設計方式取得可執行檔的證書詳細信息

如果憑證本身未安裝在工作站上但僅用於簽署該特定文件,是否可以以某種方式以程式設計方式匯出文件的數位憑證主題?

我需要以某種方式從文件中提取該資訊並檢查它是否正確。最好使用Python/CMD/PowerShell

我需要的

編輯:

抱歉缺少詳細資訊。

我目前正在使用這個 python 腳本(我將其修改為在 Python 3.6 上運行):http://www.zedwood.com/article/python-openssl-x509-parse-certificate解析我用我找到的這個小工具從原始可執行檔中提取的 .cer 檔案(我還對其進行了修改以與 Python 3 一起使用):https://blog.didierstevens.com/programs/disitool/但只有在我使用 Windows certutil 將其從 DER 編碼的二進位檔案轉換為 base-64 後。

不過,disitool 腳本的問題在於,它實際上使用pefile python 模組從可執行檔本身中剪切了一個「簽名」位元組數組,這使得提取的.cer 檔案無效,正如我在嘗試時不斷收到的python 錯誤一樣使用 OpenSSL.crypto 模組載入憑證:

 [('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')] 

但是解析一個好的提取證書(使用我上面發布的第一個腳本)是有效的,正如您在此處看到的:

解析效果很好]

所以,我想我只需要一種從可執行檔中提取憑證的方法。或者,如果您發現我的解決方案太複雜,如果您知道如何從證書的主題字段中獲取“Redmond”文本,我非常願意接受想法:)

答案1

在 Powershell 中:

Get-AuthenticodeSignature C:\Path\TO\File.exe

因此,使用您的 explorer.exe 範例,這將得到 Redmond:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split(',')[2].split('=')[1]

由於您要求詳細說明,因此Get-AuthenticodeSignature傳回 System.Management.Automation.Signature 物件。您可以透過幾種方式找到這一點。就我個人而言,我更喜歡將它分配給一個變量,這樣我就可以進一步使用返回的物件。一旦將其分配給變量,您就可以了解有關它的資訊。Get-Member應該是您在 Powershell 中常用的 cmdlet 之一。在這種情況下:

$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...

所以你可以看到該物件有一些方法和一些屬性(我知道,所有物件都有)。在本例中,這些方法都是從 System.Object 繼承的標準方法。但這些屬性很有趣。 SignerCertificate 看起來像您想要的,所以讓我們看看它是什麼樣的:

$foo.SignerCertificate


Thumbprint                                Subject
----------                                -------
419E77AED546A1A6CF4DC23C1F977542FE289CF7  CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US

指紋顯然很重要,因為它是標識證書的東西,但您已經詢問了主題中的雷德蒙德。現在我們知道如何將其作為字串來獲取:

$foo.SignerCertificate.Subject

所以從這裡開始就是直接的字串解析。

我將再補充一點,因為看來您可能正在學習 Powershell。您應該定期嘗試的另一個 cmdlet 是 Get-Command。在這種情況下,在您提出問題之前,我甚至不知道 Get-AuthenticodeSignature cmdlet 存在。所以我這樣做了:

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

答案2

在powershell中:你可以在CN中使用逗號,然後whis對我有用:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split('=')[1].split('"=')[1]

相關內容