【问题标题】:SSL Certificate with Incomplete-Chain, passes validation in .NET Core 2.2具有不完整链的 SSL 证书,在 .NET Core 2.2 中通过验证
【发布时间】:2020-03-06 15:23:23
【问题描述】:

使用 .NET Core 2.2,我需要重新创建一个不完整的链 SSL 错误,但是 ServerCertificateValidationCallback 给了我一个与我预期不同的证书链,这些证书通过了验证。有人可以解释这里出了什么问题吗?

调用 badssl.com 的独立测试:

    public void DoTheThing()
    {
        string URI = "https://incomplete-chain.badssl.com";

        ServicePointManager.ServerCertificateValidationCallback +=
            new RemoteCertificateValidationCallback(Validate.ValidateRemoteCertificate);

        using (WebClient wc = new WebClient())
        {
            var output = wc.DownloadString(URI);
        }
    }

    public static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors)
    {
        return policyErrors == SslPolicyErrors.None;
    }

我的回调中的 X509Chain 参数包含 3 个证书,*.badssl.comDigicertDigicert。证书 2 是 Digicert 并且有效。

但是SslLabs,它告诉我应该只有两个证书,第二个已过期:

【问题讨论】:

  • 检查你的逻辑。很可能是返回第三个证书无效的状态并失去第二个证书有效的事实。
  • 对于过期的证书,您需要使用不同的 URL,即:https://expired.badssl.com/。您正在访问的 URL 是关于不完整的链,与过期证书无关。而https://incomplete-chain.badssl.com 的设置存在缺陷,因此大多数框架都无法对其进行可靠测试。将构建链并接受连接。

标签: c# asp.net-core ssl ssl-certificate x509certificate


【解决方案1】:

.NET X509Chain 类具有从环境系统状态中查找丢失证书的逻辑,这在此处开始发挥作用。唯一一次您会看到来自 TLS 的不完整链是服务器发送了不完整的链并且系统无法填充缺失的部分。

SslLabs 正在报告 TLS 连接上发生的具体情况。 .NET 的X509Chain 被认为是第二个证书,认为它在链中没有意义,并将其丢弃,所以你看不到它。无法通过SslStream 查看来自 TLS 消息的原始证书数据。

【讨论】:

  • 事实上,即使系统中缺少证书,CCE 也可以使用 AIA 扩展来检索颁发者。其实badssl网站上是这么说的。
猜你喜欢
  • 2020-04-01
  • 2018-04-27
  • 2016-11-05
  • 1970-01-01
  • 2017-04-28
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多