C# X509RevocationMode.Online在吊销证书验证中出现问题

C# X509RevocationMode.Online在吊销证书验证中出现问题,c#,certificate,x509certificate,digital-signature,x509certificate2,C#,Certificate,X509certificate,Digital Signature,X509certificate2,我正在以联机模式验证证书吊销,但如果CRL已缓存在内存中,则不会命中CRL分发点中提到的url。我正在使用fiddler验证URL是否被访问。我正在遵循这些步骤 操纵小提琴手 在X509RevocationMode.Online中启动证书验证 验证fiddler,未捕获CRL分发点中提到的url 通过命令certutil-urlcache crl delete 在X509RevocationMode.Online中启动证书验证 现在,小提琴手捕捉到了CRL分发点中提到的URL 从以上步骤可以清楚

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

  • 操纵小提琴手
  • X509RevocationMode.Online中启动证书验证
  • 验证fiddler,未捕获CRL分发点中提到的url
  • 通过命令
    certutil-urlcache crl delete
  • X509RevocationMode.Online中启动证书验证
  • 现在,小提琴手捕捉到了CRL分发点中提到的URL
  • 从以上步骤可以清楚地看出,只有在CRL未缓存的情况下,才会命中CRL的url。现在我的问题是:

  • 在在线模式下访问CRL分发点中的URL时有哪些场景
  • 如果CRL已经缓存,X509Certificate如何在不点击URL的情况下验证CRL是否已更新
  • 我是否缺少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);
            }
        }
    }
    

    使用缓存版本而不重新检索CRL通常是一种特性,而不是bug

    应该发生什么:

  • CRL发布网站应向检索CRL以进行验证的https客户端使用适当的缓存指令
  • 您机器上的缓存应该根据服务器的说明来实现。(顺便说一下,磁盘通常用于缓存的internet文件,而不是内存。)
  • 但是,上述两种情况都不一定正确。如果你想变得偏执,你可以在操作系统中刷新internet文档缓存

    请回答您的问题:

  • 在在线模式下访问CRL分发点中的URL时有哪些场景?[当CRL不在缓存中时]
  • 如果CRL已经缓存,X509Certificate如何在不点击URL的情况下验证CRL是否已更新?[https的缓存控制用于假设CRL的缓存版本与远程服务器上的版本相同。]
  • 我是否缺少CRL的概念?[可能。CRL过程并不意味着是gonzo实时同步多机系统。其想法是,大多数情况下,证书自然会从到期日期过期。吊销/CRL过程不应该是正常过程,而应该更多地是异常过程。您的问题意味着CRL会在一秒钟内更新第二个基础——速度如此之快,以至于普通的web缓存技术无法接受。你为什么相信这一点?你想保护自己不受什么影响?人类是否在其正常到期时间或机器之前做出撤销证书的决定?]
  • 换句话说,如果CRL一直在更新,那么发送它时应该相应地设置缓存头。在这种情况下,您应该测试您的操作系统是否正确地没有缓存结果。如果您担心操作系统出错,那么应该显式删除缓存

    增加:


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

    谢谢您的回复。我读了更多关于CRL的文章,我的大部分疑问都很清楚。您的回答令人满意,但我想在这里提到一件事,我正在对可执行文件执行数字签名验证。您能再回答一件事吗?如果CRL被缓存并且CA在CRL下一个更新日期之前吊销了证书,将会发生什么。e、 g.假设CRl生效日期为5月1日,下一次更新日期为5月15日。我的系统已经缓存了此CRL,并且在5月9日证书被吊销,CA已更新其链接中的最新CRL。Re:正在检查CRL的可执行文件。真正的问题在于你是否信任exe的供应商。不要依赖于cert和CRL,它们可能会被坚定的敌人操纵。我建议典型的缓存长度是1天,而不是15天。因此,如果在发布新的CDL之前检索CDL,则第二天将检索更新的CDL。回复:CDL日期为1日,证书于2日撤销。直到15日,没有人会知道证书被吊销了。另外,很有可能证书应该更早被撤销…谢谢拉里。。。你的回答指导我解决了所有的疑问。记住要选择有用的答案,并“检查”回答你问题的最佳答案。别担心,欣赏是我的习惯。。。但让我澄清所有疑问。:)