【问题标题】:Issue with X509RevocationMode.Online in revoke certificate validation撤销证书验证中的 X509RevocationMode.Online 问题
【发布时间】:2013-05-01 11:44:53
【问题描述】:

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

  1. 运行提琴手。
  2. X509RevocationMode.Online 中启动证书验证
  3. 验证fiddler,CRL分发点中提到的url没有被抓到。
  4. 通过命令certutil -urlcache CRL delete从内存中清除crl
  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);
        }
    }
}

【问题讨论】:

  • 记得给有用的答案投票并“检查”最能回答您问题的答案。
  • 别担心,欣赏是我的习惯……但让我清除所有疑问。 :)

标签: c# certificate x509certificate digital-signature x509certificate2


【解决方案1】:

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

应该发生什么:

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

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

你的问题:

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

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

添加:

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

【讨论】:

  • 感谢您的回复。我阅读了更多关于 CRL 的文章,我的大部分疑虑都很清楚。您的回答令人满意,但我想在这里提一件事,我正在对可执行文件执行数字签名验证。
  • 你能再回答一件事吗?如果 CRL 被缓存并且 CA 在 CRL 下一个更新日期之前吊销了证书,将会发生什么。例如假设 CR1 生效日期是 5 月 1 日,下一次更新日期是 5 月 15 日。我的系统已经缓存了这个 CRL,并且在 5 月 9 日证书被吊销,CA 在他们的链接中更新了最新的 CRL。
  • Re:检查 CRL 中的可执行文件。真正的问题是您信任或不信任 exe 的供应商。不要依赖证书和 CRL,它们可以被坚定的敌人操纵。我建议典型的缓存长度是 1 天,而不是 15 天。因此,如果在新的 CDL 发布之前检索到 CDL,则将在第二天检索更新的 CDL。回复:CDL 日期为 1 日,证书于 2 日被撤销。直到 15 日,没有人会知道证书已被吊销。另外,很可能证书应该甚至更早被撤销......
  • 谢谢拉里...你的回答指导我解决了我所有的疑惑。
猜你喜欢
  • 2012-09-25
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多