X509VerificationFlags.IgnoreEndRevocationUnknown 有什么作用?

What Does X509VerificationFlags.IgnoreEndRevocationUnknown Do?

我验证证书的唯一方法是将 X509ChainPolicy 对象的 VerificationFlags 属性 设置为 IgnoreEndRevocationUnknown 标志。

我正在验证的证书是一个有效的 ssl 证书,由我根据我也创建的 CA 证书创建。证书的“证书路径”选项卡(在 Windows Explorer 中查看)显示消息没有问题 This certificate is OK.

如果我不使用 IgnoreEndRevocationUnknown 标志,我会得到一个 StatusInformation 吊销函数无法检查证书的吊销。

所以,我不确定为什么我会得到它并且根本不需要使用该标志。这是一些代码:

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

var cert = store.Certificates.Find(
    X509FindType.FindBySubjectName,
    "DaveSvrCert", false
    )[0];

var chain = new X509Chain();
var policy = new X509ChainPolicy
{
    RevocationFlag = X509RevocationFlag.EntireChain,
    RevocationMode = X509RevocationMode.Online,
    VerificationFlags = X509VerificationFlags.IgnoreEndRevocationUnknown
};

chain.ChainPolicy = policy;

if (!chain.Build(cert))
{
    foreach (var chainElement in chain.ChainElements)
    {
        foreach (var chainElementStatus in chainElement.ChainElementStatus)
        {
            Console.WriteLine(chainElementStatus.Status + ": ");
            Console.WriteLine(chainElementStatus.StatusInformation);
        }
    }
}

干杯!

IgnoreEndRevocationUnknown 忽略 RevocationOffline 错误。这些错误是由于 CA 配置不当且未提供证书吊销信息造成的:

  • 颁发的证书不包含CRL Distiribution Points证书扩展
  • CRL Distiribution Points 已显示,但客户端可以访问 none 个 URL。

某些应用程序默认使用此标志,但我强烈建议通过包含 CDP 扩展来解决此问题,该扩展具有全球可用且可访问的 URL 以供 CRL 下载。

并且不要使用此标志,因为当客户端成功验证并接受已吊销的证书时,它会打开一个安全漏洞。

Crypt32 的回答和建议很好,但显然有些用例您可能不想验证,或者根本无法验证 CRL,因为它无法通过网络访问。在这些情况下,您可以设置

chain.ChainPolicy.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck;

并且它将完全跳过链中所有证书的检查(可能节省一些时间,例如网络超时)。

P.S。在 Windows 中查看证书时,只需双击它并获取证书属性对话框,Windows 在显示 This certificate is OK 时不会执行 CRL 检查.该消息仅由您信任颁发证书这一事实决定。