3

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

  1. 运行提琴手。
  2. 开始证书验证X509RevocationMode.Online
  3. 验证fiddler,CRL Distribution Point中提到的url没有被抓到。
  4. 通过命令清除内存中的crlcertutil -urlcache CRL delete
  5. 开始证书验证X509RevocationMode.Online
  6. 现在 Fiddler 捕获了 CRL 分发点中提到的 URL。

从上面的步骤可以清楚地看出,只有当 CRL 没有被缓存时,才会点击 CRL 的 url。现在我的问题是:

  1. 在线访问 CRL 分发点中的 URL 提及的场景有哪些?
  2. 如果 CRL 已被缓存,X509Certificate 如何在不点击 URL 的情况下验证 CRL 是否已更新?
  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);
        }
    }
}
4

1 回答 1

4

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

应该发生什么:

  1. CRL 发布网站应该对正在检索 CRL 以进行验证的 https 客户端使用适当的缓存指令。
  2. 你机器上的缓存应该按照服务器的指令来实现。(顺便说一下,磁盘通常用于缓存 Internet 文件,而不是内存。)

但是,以上都不是真的。如果您想偏执,可以刷新操作系统中的 Internet 文档缓存。

回复您的问题:

  1. 在线访问 CRL 分发点中的 URL 提及的场景有哪些?[当 CRL 不在缓存中时]
  2. 如果 CRL 已被缓存,X509Certificate 如何在不点击 URL 的情况下验证 CRL 是否已更新?[https 的缓存控件用于假设 CRL 的缓存版本与远程服务器上的版本相同。]
  3. 我错过了 CRL 的概念吗?[也许。CRL 过程并不意味着是一个 gonzo-realtime 同步多机系统。这个想法是,在大多数情况下,证书自然会从到期日到期。撤销/CRL 过程不应该是一个正常的过程,应该更多的是一个异常过程。您的问题意味着 CRL 正在逐秒更新 - 如此之快以至于普通的 Web 缓存技术是不可接受的。你为什么相信这个?你想保护自己免受什么伤害?是人类在证书的正常到期时间或机器之前做出撤销证书的决定吗?]

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

添加:

关于检查恶意软件数字证书的博客条目。

于 2013-05-08T09:24:59.497 回答