1

我在线模式验证证书撤销,但CRL分发点中提到的URL没有得到命中,如果CRL已被缓存在内存中。我正在使用fiddler来验证URL是否被访问。我正在执行这些步骤。问题X509RevocationMode.Online在撤销证书验证

  1. 运行提琴手。
  2. 开始证书验证X509RevocationMode.Online
  3. 验证小提琴手,CRL分发点中提到的网址没有被捕获。
  4. 从内存中清除在X509RevocationMode.Online
  5. 的CRL由命令certutil -urlcache CRL delete
  6. 开始证书验证现在提琴手陷入CRL分发点中提到的URL。

从上面的步骤可以明显看出,只有当CRL没有被缓存时,CRL的URL才会被命中。现在我的问题是:

  1. 在线模式下访问CRL分发点中的URL提及的情况是什么?
  2. 如果CRL已被缓存,X509Certificate如何验证CRL是否已更新或没有点击URL?
  3. 我是否错过了CRL的概念?

这里是我的代码

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

请记住,upvote有用的答案,并“检查”最好的回答你的问题。 – 2013-05-10 09:55:29

+0

别担心,欣赏是我的习惯......但让我明确所有疑问。 :) – PawanS 2013-05-10 10:25:58

回答

2

使用缓存的版本,而不是重新检索CRL通常是功能,而不是一个错误。

应该发生什么:

  1. 的CRL发布网站应该使用正确的高速缓存指令到HTTPS客户是谁检索CRL进行验证。
  2. 应该根据服务器的指示执行机器上的缓存。 (顺便说一下,磁盘通常用于高速缓存的互联网文件,而不是内存。)

但是,以上都不是。如果你想成为偏执狂,你可以刷新操作系统中的互联网文档缓存。

回复您的问题:

  1. 什么是当CRL分发点URL提到在在线模式被访问的情景? [当CRL不在高速缓存中时]
  2. 如果CRL已经被缓存,X509Certificate如何验证CRL是否已更新或未找到URL? [https的缓存控件用于假定缓存版本的CRL与远程服务器上的版本相同。]
  3. 我是否缺少CRL的概念? [也许。 CRL过程并不意味着是一个奇闻趣事的实时同步多机系统。这个想法是,大多数情况下,证书自然失效。撤销/ CRL过程不应该是一个正常的过程,应该更像是一个例外过程。您的问题意味着CRL正在逐秒更新 - 如此之快以至于正常的网页缓存技术是不可接受的。你为什么相信这个?你想要保护自己什么?人类是否决定在正常到期时间或机器之前撤销证书?]

换句话说,如果CRL一直在更新,那么它应该与缓存头集一起发送因此。在这种情况下,您应该测试您的操作系统是否正确缓存结果。如果您担心操作系统出错,那么您应该明确删除缓存。

补充:

A blog entry关于检查恶意软件的数字证书。

+0

感谢您的回复。我阅读了更多关于CRL的文章,而且我的疑惑很明显。您的答案令人满意,但我想在此提一件事,我正在对可执行文件进行数字签名验证。 – PawanS 2013-05-09 07:37:03

+0

你能回答一件事吗?如果CRL被缓存并且CA在CRL下次更新日期之前吊销了证书,会发生什么情况。 例如假设CR1生效日期是5月1日,下一次更新日期是5月15日。我的系统已经缓存了此CRL,并且在5月9日证书被吊销,CA已更新其链接中的最新CRL。 – PawanS 2013-05-09 08:40:15

+0

Re:检查可执行文件的CRL。真正的问题是你要信任或不信任exe的供应商。不要依赖证书和CRL,他们可以由一个确定的敌人操纵。 我建议典型的缓存长度为1天,而不是15天。因此,如果在发布新CDL之前检索CDL,则将在第二天检索更新的CDL。回复:CDL的日期是1日,并且证书在2日被撤销。直到15日,没有人会知道该证书被撤销。 另外,赔率是证书**应该**已被撤销甚至更早... – 2013-05-10 09:51:23