收到的 WCF 服务器证书的部分链验证失败
Partial Chain validation failure of received WCF server certificate
我们正在与一项服务集成,该服务使用客户端证书来验证我们自己与供应商服务器之间的 https 连接。我们生成了一个 CSR,供应商向我们提供了一个包含 2 个中间证书和一个可信根证书的 p7b 文件。然后我们用来自 CSR 的私钥创建了一个 pfx 二进制文件(我们可以匹配证书和密钥,所以我们知道从那个角度来看它们是正确的)。
我们使用 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 服务器 2012r2 - TLS 连接失败
然后我们添加了一个验证回调:
ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate;
private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// ...
}
此时sslPolicyErrors
为System.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 - A certificate chain could not be built to a trusted root authority. (PartialChain)
所以我们将标志更改为X509VerificationFlags.AllowUnknownCertificateAuthority
。
这样做会导致证书链得到正确验证。
我们的问题是:
我们在不同的机器上发生了不同的影响,所以我们的结论是 Win 10 的检查没有那么严格。 Server 2012r2 是否有任何理由拒绝该链?
如果我们使用验证标志X509VerificationFlags.AllowUnknownCertificateAuthority
会不会有安全问题?
我们可以在客户端的设置中设置这个标志,还是它必须是验证回调的一部分?
so our conclusion is that Win 10 is not being as strict with its checking
这是不正确的。 Windows 客户端和 Windows 服务器 OS 共享相同的加密代码 (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 盒子上。这将自动解决问题。
我们正在与一项服务集成,该服务使用客户端证书来验证我们自己与供应商服务器之间的 https 连接。我们生成了一个 CSR,供应商向我们提供了一个包含 2 个中间证书和一个可信根证书的 p7b 文件。然后我们用来自 CSR 的私钥创建了一个 pfx 二进制文件(我们可以匹配证书和密钥,所以我们知道从那个角度来看它们是正确的)。
我们使用 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 服务器 2012r2 - TLS 连接失败
然后我们添加了一个验证回调:
ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate;
private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// ...
}
此时sslPolicyErrors
为System.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 - A certificate chain could not be built to a trusted root authority. (PartialChain)
所以我们将标志更改为X509VerificationFlags.AllowUnknownCertificateAuthority
。
这样做会导致证书链得到正确验证。
我们的问题是:
我们在不同的机器上发生了不同的影响,所以我们的结论是 Win 10 的检查没有那么严格。 Server 2012r2 是否有任何理由拒绝该链?
如果我们使用验证标志
X509VerificationFlags.AllowUnknownCertificateAuthority
会不会有安全问题?我们可以在客户端的设置中设置这个标志,还是它必须是验证回调的一部分?
so our conclusion is that Win 10 is not being as strict with its checking
这是不正确的。 Windows 客户端和 Windows 服务器 OS 共享相同的加密代码 (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 盒子上。这将自动解决问题。