具有不完整链的 SSL 证书,在 .NET Core 2.2 中通过验证

SSL Certificate with Incomplete-Chain, passes validation in .NET Core 2.2

使用 .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.comDigicert数字证书。证书 2 是 Digicert 且有效。

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

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

SslLabs 正在报告 TLS 连接上具体发生的情况。 .NET 的 X509Chain 考虑了第二个证书,认为它在链中没有意义,并将其丢弃,因此您看不到它。无法通过 SslStream.

从 TLS 消息中查看原始证书数据