以前在.NET 3.5中,此代码可以正常工作:

protected bool OpenSsl(string hostSslServer)
    {
        if ((this._enableSSL == false) || (this._isSSLOpen == true))
            return (true);

        this._isSSLOpen = false;

        this._sslConnectionStream = new SslStream(this._tcpSocket.GetStream(), false, new RemoteCertificateValidationCallback(this.ValidateServerCertificate), null);
        this._sslConnectionStream.AuthenticateAsClient(hostSslServer);
        this._sslProtocol = _sslConnectionStream.SslProtocol.ToString();

        this._isSSLOpen = true;
        return (true);
    }


该行this._sslProtocol = _sslConnectionStream.SslProtocol.toString();旨在确定正在使用的协议。但是从那时起,我发现TLS1.1和TLS1.2不在3.5中的SslProtocols枚举中,因此我将项目切换到4.5。但是现在我抛出了异常,特别是AuthenticateAsClient行。例外是“对SSPI的调用失败,请参阅内部例外。”内部例外是“收到的消息意外或格式错误”。

从那时起,我进行了一些研究,发现可以使用以下代码进行连接:

System.Security.Cryptography.X509Certificates.X509Certificate2Collection xc = new System.Security.Cryptography.X509Certificates.X509Certificate2Collection();
        this._sslConnectionStream.AuthenticateAsClient(hostSslServer, xc, System.Security.Authentication.SslProtocols.Tls12, false);


它将前一行替换为对AuthenticateAsClient的调用。但是这里的问题是,使用此代码(我必须承认我不理解),我将ssl协议设置为参数之一。我不想那样做。我想知道主机正在使用的SSL协议。

有没有办法解决?

从那时起,我将sslprotocols的参数更改为:

SslProtocols.Ssl2 | SslProtocols.Ssl3 | SslProtocols.Tls | SslProtocols.Tls11 | Ssl协议

并引发了另一个异常:“客户端和服务器无法通信,因为它们不具有通用算法”

最佳答案

我从协议列表中删除了SSL2,它可以正常工作。

关于c# - 移至.NET 4.51时SSLStream引发异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33548190/

10-11 11:58