2016-10-10 2 views
0

signtool.exeを使用してexeファイルを署名しました。 ( - > [プロパティ] - > [デジタル署名 - >詳細 - > [証明書の表示 - 右クリック>パス)私はWindowsを使用して署名を表示すると予想されるように、チェーンは、次のようになります。X509Certificate.CreateFromSignedFileはリーフ証明書のみを取得します

Verisign 
| 
---Symantec Class 3 SHA256 Code Signing CA 
    | 
    ---Me 

しかし、私はロードする場合証明書は、.NET API X509Certificate.CreateFromSignedFile(path)を使用し、X509Certificate2UI.DisplayCertificate(cert)を使用して証明書を見て、私は葉の証明書のみを参照してください。もちろん、チェーンが見つからないため、X509Chainを使用してチェーンを構築しようとすると失敗します。

これは予想された動作であり、管理された.NETコード(WinVerifyTrust p/invokeを使用せずに読み込み)を使用してチェーン全体を構築する方法はありますか?

+0

私はあなたがそこに私を指しているため、[この](http://stackoverflow.com/a/9152838/4684493)の答えで – Hintham

+0

感謝を見てする必要があると思います。おそらく、X509Certificate2オブジェクトを使用すると、私にリーフノードが与えられるように思われます。しかし、その質問の例は、証明書ファイル(つまり、pfx)を使用してチェーン全体をインポートすることについてのみ説明していますが、署名付き実行可能ファイルからインポートする必要があります。それは可能ですか? – MrPiao

+0

OK、そうです。 [this](http://security.stackexchange.com/questions/50959/how-to-check-executable-code-signing-signatures)に従って、 'X509Certificate'から' X509Certicate2'を作成することができます。署名付き実行可能ファイルから取得します。これにより、証明書チェーンを構築して検証することができます。大まかに: 'var cert = X509Certificate.CreateFromSignedFile(" path \ to \ signed_file "); var cert2 = new X509Certificate2(cert); '次に、' var chain = new X509Chain(); var isValid = chain.Build(cert2); ' – Hintham

答えて

0

はい、いいえ。

UIワークフローで、[証明書の表示]を押すと、ファイルプロパティダイアログからCertUIダイアログに切り替わります。 CertUI(たぶん)はリーフ/エンドエンティティ証明書だけを見て、次に証明書チェーン自体を構築します。その時点では、署名されたファイルに他に何があったかについてはやや疑問があります。

ファイルに埋め込まれているすべての証明書情報を読み取ることで、1回の呼び出しでさらに少しずつ取得できます。私のローカルテストでは、EE証明書(署名していなかったため)と中間CA(署名行なし)を作成しましたが、ルート証明書は作成していません(通常、それを信頼しないので、無駄なバイトです)。

var coll = new X509Certificate2Collection(); 
coll.Import("signedfile.exe"); 
// My coll had 2 certs at this point. 

だから、それが中間体を解決する助けを必要とする場合にはX509Chain.ChainPolicy.ExtraStoreにそれらのすべての証明書を渡すことができますが、あなたはまだチェーンを構築するために必要なルートを決定します。

using (X509Certificate2 cert = new X509Certificate2("signedfile.exe")) 
{ 
    X509Chain chain = new X509Chain(); 
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid; 

    bool validChain = chain.Build(cert); 

    if (!validChain) 
    { 
     // Whatever you want to do about that. 

     foreach (var status in chain.ChainStatus) 
     { 
      // In reality you can == this, since X509Chain.ChainStatus builds 
      // an object per flag, but since it's [Flags] let's play it safe. 
      if ((status.Status & X509ChainStatusFlags.PartialChain) != 0) 
      { 
       // Incomplete chain. 
      } 
     } 
    } 

    X509Certificate2Collection chainCerts = new X509Certificate2Collection(); 

    foreach (var element in chain.ChainElements) 
    { 
     chainCerts.Add(element.Certificate); 
    } 

    // now chainCerts has the whole chain in order. 
} 
+0

ちょうどこの答えを見たはずです。 ..私がこれに対する答えを必要とした時代は過ぎましたが、好奇心のうちに来週にこれを試してみましょう – MrPiao

関連する問題