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

问题描述 投票:0回答:1

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

我们使用保险柜存储我们的相互身份验证证书,因此将pfx not安装到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 - A certificate chain could not be built to a trusted root authority. (PartialChain)

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

这样做使证书链得到正确验证。

我们有的问题是:

  1. 我们在不同的计算机上发生不同的影响,因此我们的结论是Win 10的检查并不严格。 Server 2012r2拒绝链有什么理由吗?

  2. 如果使用验证标志X509VerificationFlags.AllowUnknownCertificateAuthority,是否存在任何安全问题?

  3. 我们可以在客户端设置中设置此标志,还是必须将其作为验证回调的一部分?

c# wcf security ssl x509certificate
1个回答
0
投票

所以我们的结论是Win 10的检查并不严格

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

如果使用验证标志X509VerificationFlags.AllowUnknownCertificateAuthority?,是否存在任何安全问题

是,此标志为MITM攻击打开了大门。

我们可以在客户端设置中设置此标志,还是必须将其作为验证回调的一部分?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.