X509VerificationFlags 値は抑制であるため、X509VerificationFlags.AllFlags
実際に指定すると、ほとんどの状況で Build が false を返すのを防ぐことができます。
RevocationStatusUnknown
応答は特に関連性があるようです。失効していないことを確認できないと報告している証明書はどれでも。Verify
メソッドは次のようにモデル化できます。
public bool Verify()
{
using (X509Chain chain = new X509Chain())
{
// The defaults, but expressing it here for clarity
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.VerificationTime = DateTime.Now;
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
return chain.Build(this);
}
}
アサートしていないため、X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown
またはX509VerificationFlags.IgnoreEndRevocationUnknown
以外の X509RevocationMode を要求しているためNone
、失敗します。
まず、チェーン内のどの証明書が失敗しているかを特定する必要があります。
using (X509Chain chain = new X509Chain())
{
// The defaults, but expressing it here for clarity
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
chain.ChainPolicy.VerificationTime = DateTime.Now;
chain.Build(cert);
for (int i = 0; i < chain.ChainElements.Count; i++)
{
X509ChainElement element = chain.ChainElements[i];
if (element.ChainElementStatus.Length != 0)
{
Console.WriteLine($"Error at depth {i}: {element.Certificate.Subject}");
foreach (var status in element.ChainElementStatus)
{
Console.WriteLine($" {status.Status}: {status.StatusInformation}}}");
}
}
}
}
Windows CertUI (エクスプローラーまたは証明書 MMC スナップインで .cer をダブルクリック) で失敗した証明書を確認する場合は、「CRL 配布ポイント」という名前のフィールドを探します。これらは、実行時に取得される URL です。おそらく、システムには、これらの特定の値を照会することを許可しないデータ送信制限があります。いつでも Web サービスから Web 要求を発行してみて、証明書サブシステム内にあるというコンテキストなしで URL を取得できるかどうかを確認できます。