プログラムで実行ファイルの証明書の詳細を取得する

プログラムで実行ファイルの証明書の詳細を取得する

証明書自体がワークステーションにインストールされておらず、特定のファイルの署名にのみ使用されている場合、何らかの方法でファイルのデジタル証明書の件名をプログラムでエクスポートすることは可能ですか?

何らかの方法でファイルからその情報を抽出し、正しいかどうかを確認する必要があります。できればPython/CMD/PowerShellを使用します。

必要なもの

編集:

詳細が足りず申し訳ありません。

現在、次の Python スクリプトを使用しています (Python 3.6 で実行できるように変更しました)。http://www.zedwood.com/article/python-openssl-x509-parse-certificate私が見つけたこの小さなツール(Python 3 でも動作するように変更しました)を使用して、元の実行可能ファイルから抽出した .cer ファイルを解析します。https://blog.didierstevens.com/programs/disitool/ただし、Windows certutil を使用して DER エンコードされたバイナリから base-64 に変換した後でのみ可能です。

しかし、disitool スクリプトの問題は、pefile Python モジュールを使用して、実行可能ファイル自体から「署名」バイト配列を文字通り切り取ることです。これにより、OpenSSL.crypto モジュールを使用して証明書をロードしようとすると、Python エラーが発生し、抽出された .cer ファイルが無効になります。

 [('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-AuthenticodeSignatureSystem.Management.Automation.Signature オブジェクトを返します。これを調べる方法はいくつかあります。個人的には、返されたオブジェクトをさらに操作できるように、変数に割り当てることを好みます。変数に割り当てると、そのオブジェクトについて学習できます。PowershellGet-Memberでよく使用するコマンドレットの 1 つになります。この場合:

$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

指紋は証明書を識別するものであるため明らかに重要ですが、件名にある Redmond について質問されました。これで、文字列としてそれを取得する方法がわかりました。

$foo.SignerCertificate.Subject

ここからは単純に文字列を解析するだけです。

あなたが Powershell を学習しているようなので、もう 1 つ補足しておきます。定期的に試すべきもう 1 つのコマンドレットは Get-Command です。この場合、質問される前に Get-AuthenticodeSignature コマンドレットが存在することすら知りませんでした。そこで、次の操作を実行しました。

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 にカンマを使用できます。これでうまくいきました:

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

関連情報