gpt4 book ai didi

c# - 收到的 WCF 服务器证书的部分链验证失败

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:56 24 4
gpt4 key购买 nike

我们正在与一项服务集成,该服务使用客户端证书来验证我们自己与供应商服务器之间的 https 连接。我们生成了一个 CSR,供应商向我们提供了一个包含 2 个中间证书和一个可信根证书的 p7b 文件。然后,我们使用来自 CSR 的私钥创建了一个 pfx 二进制文件(我们可以匹配证书和 key ,因此我们知道从这个角度来看它们是正确的)。

我们使用 Vault 来存储我们的相互身份验证证书,因此 pfx 安装到 Windows Server 2012r2 上。

在我们的客户端代码中,我们执行以下操作:

var myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

var client = new ServiceClient(myBinding, new EndpointAddress("https://example.org"));
client.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2("cert.pfx", "****");
client.create(new model());

通过上述设置,我们有以下影响:

  • Windows 10 开发机 - 成功建立 TLS 连接
  • Windows Server 2012r2 - TLS 连接失败

然后我们添加了一个验证回调:

ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate;

private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// ...
}

此时 sslPolicyErrorsSystem.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors

如果我们尝试构建自己的 SSL 链:

using (var chain = new X509Chain())
{
var flag = X509VerificationFlags.NoFlag;
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
chain.ChainPolicy.VerificationFlags = flag;

var primaryCert = new X509Certificate2(certificate);

var n = chain.Build(primaryCert);
Console.WriteLine($"Flag: {flag} - {string.Join(",", chain.ChainStatus.Select(x => $"{x.StatusInformation.Trim()} ({x.Status})"))}");

return n;
}

我们得到打印 - Flag:NoFlag - 无法为受信任的根机构构建证书链。 (部分链)

因此我们将标志更改为 X509VerificationFlags.AllowUnknownCertificateAuthority

这样做会导致证书链得到正确验证。

我们的问题是:

  1. 我们在不同的机器上发生了不同的影响,所以我们的结论是 Win 10 的检查没有那么严格。 Server 2012r2 是否有任何理由拒绝该链?

  2. 如果我们使用验证标志 X509VerificationFlags.AllowUnknownCertificateAuthority 会不会有任何安全问题?

  3. 我们可以在客户端的设置中设置这个标志,还是它必须是验证回调的一部分?

最佳答案

so our conclusion is that Win 10 is not being as strict with its checking

这是不正确的。 Windows 客户端和 Windows 服务器操作系统共享相同的加密代码 (CAPI2) 和配置。

Are there any security issues if we use the verification flag X509VerificationFlags.AllowUnknownCertificateAuthority?

是的,这个标志为MITM打开了大门攻击。

Can we set this flag in the setup of the client, or does it have to be part of the validation callback?

您真正需要的是解决问题。该错误表明服务器证书不是由受信任的 CA 颁发的。这个 CA(服务器 TLS 证书的颁发者)被开发机器信任,因为开发者信任这个 CA(管理员已经在受信任的根存储中安装了开发 CA 证书)。

如果您已从供应商处收到 CA 证书,则它们也必须安装在 Windows Server 2012 机器上。这将自动解决问题。

关于c# - 收到的 WCF 服务器证书的部分链验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58606952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com