SslStream:处理证书时发生未知错误

时间:2015-10-26 08:12:43

标签: c# ssl sslstream tls1.2

我正在尝试使用SslStream和TLS 1.2协议建立到远程服务器的TCP连接。代码如下:

_tcpClient.Connect(endPoint);

var certificate = new X509Certificate2(_settings.CertificateFilePath, _settings.CertificatePassword, X509KeyStorageFlags.MachineKeySet);
var certificates = new X509CertificateCollection { certificate };

_nStream = _tcpClient.GetStream();
_sslStream = new SslStream(_nStream, false,
    (o, x509Certificate, chain, errors) => true,
    (o, s, collection, x509Certificate, issuers) =>
    { return collection[0]; }
);

_sslStream.AuthenticateAsClient(_settings.HostIpAddress, certificates, SslProtocols.Tls12, true);
_sslStream.Write(someData, 0, someData.Length);

但是,我得到了一个例外:

  

System.Security.Authentication.AuthenticationException:对SSPI的调用   失败了,看内部异常。 --->   System.ComponentModel.Win32Exception:发生未知错误   处理证书

     

---内部异常堆栈跟踪结束

     

at System.Net.Security.SslState.CheckThrow(Boolean authSucessCheck)   在System.Net.Security.SslStream.Write(Byte []缓冲区,Int32偏移量,Int32计数)

我启用了SChannel日志记录,并在Windows事件日志中找到了它:

  

远程服务器已请求SSL客户端身份验证,但没有   可以找到合适的客户证书。匿名连接   将会尝试。

然后我按照here所述启用了System.Net loggiing并获得this log(我从中删除了一些证书数据)。看起来客户端证书是正常的,但由于某种原因,日志显示Remote certificate: null,尽管显然有一些数据从远程服务器发回,看起来非常像证书。在最后,日志显示returned code=CertUnknown。我不知道问题可能在哪里(远程服务器证书?我的代码?远程/本地服务器设置?),并希望得到任何帮助。

注意: 如果我通过指定SslProtocols.Ssl3而不是SslProtocols.Tls12来更改我的代码以使用SSL 3,那么一切正常。但我真的需要使用TLS,因为这是远程服务器所有者要求的。

1 个答案:

答案 0 :(得分:-1)

我们让 websockets 服务器使用 TLS 1.2。

手动添加“ws.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;”解决了问题。