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

C# SslStream:处理证书时发生未知错误,c#,ssl,sslstream,tls1.2,C#,Ssl,Sslstream,Tls1.2,我正在尝试使用SslStream和TLS1.2协议建立到远程服务器的TCP连接。代码如下: _tcpClient.Connect(endPoint); var certificate = new X509Certificate2(_settings.CertificateFilePath, _settings.CertificatePassword, X509KeyStorageFlags.MachineKeySet); var certificates = new X509Certifica

我正在尝试使用SslStream和TLS1.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:运行时发生未知错误 处理证书

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

在System.Net.Security.SslState.CheckThrow(布尔authsuccescheck) 在System.Net.Security.SslStream.Write(字节[]缓冲区,Int32偏移量,Int32计数)

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

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

然后,我按照描述启用了System.Net日志并获得了(我从中删除了一些证书数据)。看起来客户端证书正常,但出于某种原因,日志显示
远程证书:null
,尽管从远程服务器发送回来的某些数据看起来很像证书。最后日志显示
返回的代码=certnknown
。我不知道问题出在哪里(远程服务器证书?我的代码?远程/本地服务器设置?),如果您能提供帮助,我将不胜感激

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

我们让WebSocket服务器使用TLS 1.2


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

您使用的是哪种证书,是自签名证书?只需检查.cer文件是否存在于TCP客户端证书存储中。证书由远程服务器所有者签名。正如我在问题中所写的,如果我更改一行代码(tls12->ssl2),那么在相同的证书和所有其他设置下,一切都可以正常工作。因此,证书可以与SSL配合使用。为什么它不能与TLS一起工作——我一辈子都搞不清楚。TLS是SSL的继承者。我认为TLS12=>TLS1.2在服务器\客户端上没有启用。请按照“适用于TLS 1.2”一节中的指示在注册表中进行检查。如果没有,请尝试启用它并再次运行该程序。TLS 1.2在客户端启用,因为我可以在我的计算机上的SChannel事件日志中看到成功的TLS 1.2与其他服务器握手。而且它肯定是在服务器端启用的,因为服务器成功地接受来自其他客户端的TLS 1.2连接。欢迎使用堆栈溢出!请不要添加多个问题。回答最好的一个,并将其余的标记为重复项。看见