我正在验证在线模式下的证书撤销,但如果CRL已经缓存在内存中,则CRL分发点中提到的URL不会被命中。我正在使用fiddler来验证是否访问了URL。我正在遵循这些步骤。
X509RevocationMode.Online
certutil -urlcache CRL delete
X509RevocationMode.Online
从上面的步骤可以清楚地看到,只有在没有缓存CRL时才会命中CRL的url。现在我的问题是:
这是我的代码
private void BuildCertificateChain(X509Certificate2 certificate)
{
string error = null;
X509Chain certificateChain = new X509Chain();
certificateChain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
certificateChain.ChainPolicy.VerificationTime = DateTime.Now;
certificateChain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
certificateChain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 15);
try
{
if (certificateChain.Build(certificate))
{
foreach (X509ChainElement element in certificateChain.ChainElements)
{
Trace.WriteLine(string.Format("Issuer = {0}\nSubject = {1}", element.Certificate.Issuer, element.Certificate.Subject));
element.Certificate.Verify();
}
}
else
{
error = string.Format("File {0} digital signature seems to be not valid due to a certificate in certificate chain being revoked. Revocation reasons are:\n", filename);
foreach (X509ChainStatus status in certificateChain.ChainStatus)
{
error += status.StatusInformation;
}
}
}
catch (Exception ex)
{
error = string.Format("Exception building certificate chain for executing application {0}. The error is {1}", _executingAppFileName, ex.Message);
}
if (!string.IsNullOrEmpty(error))
{
//SetError(error);
}
}
}
答案 0 :(得分:2)
使用缓存版本而不是重新检索CRL通常是一个功能,而不是错误。
会发生什么:
但是,以上都不是真的。如果你想成为偏执狂,你可以在操作系统中刷新互联网文档缓存。
回答你的问题:
换句话说,如果CRL一直在更新,那么它应该与相应的缓存头一起发送。在这种情况下,您应该测试您的操作系统是否正确缓存了结果。如果您担心操作系统出错,那么您应该明确删除缓存。
添加了:
A blog entry关于检查恶意软件的数字证书。