はい、いいえ。
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.
}
私はあなたがそこに私を指しているため、[この](http://stackoverflow.com/a/9152838/4684493)の答えで – Hintham
感謝を見てする必要があると思います。おそらく、X509Certificate2オブジェクトを使用すると、私にリーフノードが与えられるように思われます。しかし、その質問の例は、証明書ファイル(つまり、pfx)を使用してチェーン全体をインポートすることについてのみ説明していますが、署名付き実行可能ファイルからインポートする必要があります。それは可能ですか? – MrPiao
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