【问题标题】:x509Certificate revocation check using RemoteCertificateValidationCallback in C#在 C# 中使用 RemoteCertificateValidationCallback 进行 x509Certificate 吊销检查
【发布时间】:2019-07-29 13:35:20
【问题描述】:

在我的 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;
    }
}

【问题讨论】:

标签: c# x509 certificate-revocation


【解决方案1】:

如果检查了吊销并且证书被吊销,它将通过两件事来检测

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

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

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

【讨论】:

  • 谢谢,@bartonjs。有没有办法影响默认检查的行为以使其执行撤销检查?在默认检查结束后,我只能访问处理程序中的链对象,在我的情况下,它显示 RevocationMode==NoCheck。有什么方法可以提前影响这个吗?
  • @JonyVol 根据您使用 SslStream 的方式,在选项类上设置 CertificateRevocationCheckMode 属性,或者调用更长的 (Begin)AuthenticateAs[Client|Server] 重载并指定 checkCertificateRevocation: true
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2016-11-13
  • 2019-08-15
相关资源
最近更新 更多