在撤销证书验证中出现X509RevocationMode.Online问题

时间:2013-05-07 13:35:07

标签: c# certificate x509certificate digital-signature x509certificate2

我正在验证在线模式下的证书撤销,但如果CRL已经缓存在内存中,则CRL分发点中提到的URL不会被命中。我正在使用fiddler来验证是否访问了URL。我正在遵循这些步骤。

  1. 运行fiddler。
  2. X509RevocationMode.Online
  3. 中启动证书验证
  4. 验证fiddler,未捕获CRL分发点中提到的URL。
  5. 通过命令certutil -urlcache CRL delete
  6. 从内存中清除crl
  7. X509RevocationMode.Online
  8. 中启动证书验证
  9. 现在Fiddler抓住了CRL Distribution Point中提到的URL。
  10. 从上面的步骤可以清楚地看到,只有在没有缓存CRL时才会命中CRL的url。现在我的问题是:

    1. 在线模式下访问CRL分发点中提及的URL时有哪些方案?
    2. 如果CRL已经被缓存,X509Certificate如何在不点击URL的情况下验证CRL是否已更新?
    3. 我是否错过了CRL的概念?
    4. 这是我的代码

          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);
              }
          }
      }
      

1 个答案:

答案 0 :(得分:2)

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

会发生什么:

  1. CRL发布网站应使用正在检索CRL进行验证的https客户端的正确缓存说明。
  2. 应根据服务器的说明实施计算机上的缓存。 (顺便说一句,磁盘通常用于缓存的Internet文件,而不是内存。)
  3. 但是,以上都不是真的。如果你想成为偏执狂,你可以在操作系统中刷新互联网文档缓存。

    回答你的问题:

    1. 在线模式下访问CRL分发点中的URL提及时,有哪些方案? [当CRL不在缓存中时]
    2. 如果已经缓存了CRL,X509Certificate如何验证CRL是否已更新,而不会更新URL? [https的缓存控件用于假设CRL的缓存版本与远程服务器上的版本相同。]
    3. 我是否错过了CRL的概念? [也许。 CRL过程并不是一个奇闻趣事 - 实时同步多机系统。这个想法是,大多数时候,证书自其到期日自然到期。撤销/ CRL过程不应该是一个正常的过程,应该是一个例外过程。您的问题意味着CRL正在逐秒更新 - 如此之快,以至于不能接受正常的Web缓存技术。你为什么相信这个?你想保护自己免受什么攻击?人们是否决定在正常的到期时间或机器之前撤销证书?]
    4. 换句话说,如果CRL一直在更新,那么它应该与相应的缓存头一起发送。在这种情况下,您应该测试您的操作系统是否正确缓存了结果。如果您担心操作系统出错,那么您应该明确删除缓存。

      添加了:

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