在 C# 中使用 RemoteCertificateValidationCallback 检查 x509Certificate 吊销

x509Certificate revocation check using RemoteCertificateValidationCallback in C#

在我的 C# 项目中,我将 RemoteCertificateValidationCallback 委托的自定义实现传递给 SslStream。然后使用它来验证服务器证书。自定义实现检查默认实现设置的 sslPolicyErrors 标志,并根据结果调用自定义逻辑。默认实现为多种类型的证书问题设置标志,例如主题名称不匹配、证书链不完整或证书是否过期。 我的问题:我能否从 RemoteCertificateValidationCallback 的默认实现结果中以任何方式推断证书已被吊销(即在任何类型的 CRL 中列出)?或者我是否需要将自定义逻辑添加到我自己的 RemoteCertificateValidationCallback 实现中以进行吊销检查?

换句话说,在下面的示例代码中,如果证书被吊销,这将以任何方式反映在 sslPolicyErrors 标志、certificate 对象或 chain 目的?还是我必须为撤销检查添加额外的逻辑?

RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;
    }
    else if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch)
    {
        // Custom check by additional data available for the certificate...
    }
    else
    {
        return false;
    }
}

如果检查了吊销并且证书被吊销,则可以通过两件事检测到

  1. sslPolicyErrors 将设置 RemoteCertificateChainErrors 位。
  2. 循环chain.ChainStatus X509ChainStatus.Status 值之一将是X509ChainStatusFlags.Revoked

如果请求撤销,但无法确定,则 ChainStatus 值之一将为 X509ChainStatusFlags.RevocationUnknown

最后,要确定是否请求撤销,您可以检查 chain.ChainPolicy.RevocationModeOnline 表示是,NoCheck 表示否,Offline 很复杂(检查缓存的答案,但如果没有缓存的答案,则变为 RevocationUnknown)。