2011-08-30 16 views
12

署名付き実行可能イメージの証明書を検証したい(検証によって、署名がMS/Adob​​e/Oracleなどから来たものかどうかを確認する)。ウィンドウはこのタスクのためにAPIを提供しますか?どのようにすればいいのでしょうか?どんな助けもありがとう。 私はWindowsとC++を使用しています。 .NETアセンブリやJava jarファイルではなく、ネイティブの実行可能イメージを検証したい実行可能ファイルから証明書を読み取って検証する

UPDATE


[OK]を、私は私がすぐに欲しいものを説明しようとするでしょう。

1)PE証明書を検証します。署名は有効かどうか。署名がPEに埋め込まれている場合と、署名がセキュリティカタログに含まれている場合に動作します。 (私はこれをsysinternalsフォーラムで見つけたのでうまく動作するので、もうこれは必要ありません)。

2)ファイルの署名者/発行者を教えてください。 CryptQueryObject(セキュリティカタログでは動作しませんが、実際の例が見つかりました)を使って実現できますが、セキュリティカタログファイルでどのように使用するかはわかりません。

答えて

20

実行可能ファイルの署名を取得して確認する方法と、必要なその他の追加情報を取得する方法については、多くのAPIとアプローチがあります。問題はどのレベルを選択するか(WinVerifyTrustのような高レベル)

CATまたはEXEファイルから暗号コンテキストを取得するのに使用できる最も簡単なAPIはCryptQueryObjectです。 KB323809のコード例は、必要な情報をどのようにデコードするかについての主要なアイデアを得ることができます。 CATファイルで作業する場合の主な違いは、CryptQueryObjectのいくつかのパラメータを変更する必要があることです。私はあなたがちょうどあなたが内部的に必要なすべてのものを行いますCERT_QUERY_CONTENT_FLAG_ALLCERT_QUERY_FORMAT_FLAG_ALLCryptQueryObjectを使用することをお勧めします。

BOOL bIsSuccess; 
DWORD dwEncoding, dwContentType, dwFormatType; 
HCERTSTORE hStore = NULL; 
HCRYPTMSG hMsg = NULL; 
PVOID pvContext = NULL; 

// fill szFileName 
... 

// Get message handle and store handle from the signed file. 
bIsSuccess = CryptQueryObject (CERT_QUERY_OBJECT_FILE, 
           szFileName, 
           CERT_QUERY_CONTENT_FLAG_ALL, 
           CERT_QUERY_FORMAT_FLAG_ALL, 
           0, 
           &dwEncoding, 
           &dwContentType, 
           &dwFormatType, 
           &hStore, 
           &hMsg, 
           &pvContext); 

CryptQueryObjectで設定した値dwContentTypeはあなたのファイルszFileNameの種類についての基本情報を取得します。 pvContextは必要なほとんどの場合PCCERT_CONTEXTになりますが、.ctlまたは.crlファイルを入力として使用する場合はPCCRL_CONTEXTまたはPCCTL_CONTEXTでもかまいません。ファイルszFileNameからすべての証明書でいっぱいのhStoreが届きます。したがって、pvContexthStoreに関しては、CryptoAPIを含むファイルを調べることができます。 (少なくともCERT_QUERY_CONTENT_PKCS7_SIGNEDの場合、CERT_QUERY_CONTENT_PKCS7_UNSIGNED,CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED)の場合には、の場合に追加設定されるhMsgを使用して、 ローレベルマッサージAPIを使用することをお勧めします。

は、私はあなたが CertGetCertificateChainCertVerifyCertificateChainPolicyは、証明書が一般的に有効であるだけでなく、ことを確認するために使用することをお勧めしますファイルの署名を検証するために、それ(またはそのすべての親が)のAuthenticode( szOID_PKIX_KP_CODE_SIGNING)に対して有効であること。 CertGetCertificateChainは、さまざまな失効シナリオで使用できます。 CERT_CHAIN_POLICY_AUTHENTICODECERT_CHAIN_POLICY_AUTHENTICODE_TSという2つの別々のコールを実行して、AuthenticodeチェーンポリシーとAuthenticodeタイムスタンプチェーンポリシーの両方が有効であることを確認する必要があります。

更新済み:最新の質問(更新済み部分)を再読しました。あなたの現在の問題は、ファイルの署名者/発行者を取得する方法です。だから私はその質問だけに答えます。

あなたが署名検証のためのthe code from sysinternalを使用する場合は、あなただけのライン

if (!CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0)) 

のために、そのファイルが署名が関連して検証されるシステムのWindowsのファイルである場合にはInfoStructのフィールドを設定するステートメント敷居を検索します.catファイルの一部。フィールドInfoStruct.wszCatalogFileには、.catファイルの名前が表示されます。

C:\Windows\explorer.exeファイルのデジタル署名を検証しようとすると、私のWindows 7などで、そのハッシュが見つかった.catはC:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.catです。

CryptQueryObjectのパラメータを、上述とあなたがKB323809からコードを使用する場合は、C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.catSPC_SP_OPUS_INFO_OBJID(「1.3.6.1.4.1.311.2.1.12」)の属性をデコードします(機能GetProgAndPublisherInfoを参照)、あなたが知っているだろう

pwszProgramName: "Windows Express Security Catalogs" 
pPublisherInfo: NULL 
pMoreInfo->dwLinkChoice: SPC_URL_LINK_CHOICE 
pMoreInfo->pwszUrl "http://www.microsoft.com" 

ファイルには特別なパブリッシャー情報は含まれていません。カタログの署名者を調べる場合は、ことがわかります。

The signer of the .cat file: "Microsoft Windows" 
The signer signed it with the certificate: 
    Serial Number: 0x6115230F00000000000A 
    Issuer Name: Microsoft Windows Verification PCA 
    Full Issuer Name: 
     CN = Microsoft Windows Verification PCA 
     O = Microsoft Corporation 
     L = Redmond 
     S = Washington 
     C = US 
    Subject Name: Microsoft Windows 
    Full Subject Name: 
     CN = Microsoft Windows 
     OU = MOPR 
     O = Microsoft Corporation 
     L = Redmond 
     S = Washington 
     C = US 
The Date of TimeStamp : 28.02.2011 21:16:36 
TimeStamp Certificate: 
    Serial Number: 0x6103DCF600000000000C 
    Issuer Name: Microsoft Time-Stamp PCA 
    Subject Name: Microsoft Time-Stamp Service 

explorer.exeの他の署名者が存在しないので、だから、の.catファイルのちょうど署名者を使用する必要があります。

+0

ありがとうございます+1、私はあなたの時間をいただきありがとうございます。私はまだいくつかの問題を抱えていますが、あなたのおかげで、私は以前よりも目標に近いです感じ:)。 CryptQueryObjectをexplorer.exeに呼び出すと、「オブジェクトを検索しようとすると一致しません」というエラーコード80092009が返されます。 explorer.exe(?)のカタログが見つかりませんでした。 – Davita

+0

@Davita:テキストファイルやエクスプローラのような署名されていない実行可能ファイルを調べようとするならば。exe)あなたは[CRYPT_E_NO_MATCH](http://msdn.microsoft.com/en-us/library/aa909166.aspx)エラーを受け取る 'CryptQueryObject'に関して、 explorer.exeのプロパティを調べると、「デジタル署名」タブが表示されないので、ファイルは署名されていません。実装に他の問題がある場合は、私に尋ねることができます。数年前、EXE、CATなどのコードで多くの時間を費やしました。だからおそらく私はすぐにあなたを助けることができるでしょう。 – Oleg

+0

多くのありがとうオレグ、私は本当にあなたの努力に感謝します。まだ混乱があります。 http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html < - このコードでexplorer.exeをチェックすると、WinVerifyTrustは署名が有効であることを伝えます。私が何かを紛失していたり​​、PEの署名とカタログファイルが別の目的を持っていますか? (おかげで再び – Davita

3

WinVerifyTrust関数は、指定されたオブジェクトに対して信頼確認アクションを実行します。この関数は、アクション識別子が存在する場合は、それをサポートする信頼プロバイダに問い合わせを渡します。

証明書の検証には、CertGetCertificateChain関数とCertVerifyCertificateChainPolicy関数を使用します。

+0

おかげでジョンの三番目のパラメータでCERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED代わりのCERT_QUERY_CONTENT_FLAG_ALLを試してみることです、私は、MSDNで提供された例を試してみましたが、それは私のようなWindowsのコアファイルを検証しようとする場合を除いて、ほとんど毎回素晴らしい作品explorer.exe。 explorer.exeは署名されていないと言われていますが、Peexplorerはexplorer.exeの署名が確認されたことを伝えています。私は紛失しているものが混乱しています... – Davita

+1

システムファイルは、署名されたカタログファイルに格納されたハッシュを持っています。ここでコードを参照してください:http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html –

+0

@Bevan Collins、ありがとう、それはうまくいった:)あなたは教えてくださいどのように証明書に署名したのかなど、証明書情報を取得する必要がありますか?おかげで – Davita

1

@Davita 上記の問題を完全に読んで解決しようとしました。

私の提案はCryptQueryObject()

関連する問題