SSLStream在服务器身份验证上设置受信任的证书颁发机构

时间:2016-01-18 15:45:49

标签: c# .net ssl

我正在尝试验证有证书交换的客户端。我遇到的问题是openssl客户端拒绝连接尝试,因为身份验证握手中不包含证书颁发机构。

这似乎适用于在Windows Server 2008 R2上运行的实例,但在我的两个开发环境(Windows 10和Windows 7)中都失败了。我已经查看并试图更改一些可能阻止添加证书颁发机构但无法使其正常工作的Windows设置(主要是本地组策略)。

是LocalCertificateSelectionCallback的字符串数组acceptedIssuers字段的函数吗?

我还发现另一个stackoverflow php solution相关但不知道如何将它应用于sslstream类。

我的代码看起来像这样

var _nwStream = new SslStream(client.GetStream(), true,
(sender, certificate, chain, sslPolicyErrors) =>
{
  bool policyErrs = (sslPolicyErrors & (SslPolicyErrors.RemoteCertificateChainErrors | SslPolicyErrors.RemoteCertificateNotAvailable)) != 0;
  if (policyErrs)
  {
    string message = string.Format("Remote Certificate failed for client: {0}, SSL policy errors {1}", client.Client.RemoteEndPoint, sslPolicyErrors);
    return !policyErrs;
},
(sender, targetHost, localCertificates, remoteCertificate, acceptableIssuers) =>
{
  acceptableIssuers = new string[] { _cert.Issuer };
  return _cert;
});

_nwStream.AuthenticateAsServer(_cert, true, System.Security.Authentication.SslProtocols.Tls, true);

非常感谢任何帮助 - 谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,我不知道为什么它没有早点出现。有一个注册表项 的 HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\ SecurityProviders \ SCHANNEL 名为 SendTrustedIssuerList 的设置为0,将其更改为1解决了问题。在Windows Server实例上,此标志可能默认设置为1。