如果憑證本身未安裝在工作站上但僅用於簽署該特定文件,是否可以以某種方式以程式設計方式匯出文件的數位憑證主題?
我需要以某種方式從文件中提取該資訊並檢查它是否正確。最好使用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]