我正在尝试连接基于
Java netty的服务器,它自动为自己生成证书(服务器人告诉我,现在接受来自客户端的任何证书).
我的任务是将TcpSocket连接迁移到Tls加密连接.
首先,我将TcpSocket转换为NetworkStream:
using (var client = new NetworkStream(connection.TcpSocket)) { if (client.CanRead) { client.BeginRead(recvState.DataBuffer,recvState.DataBuffer.Length,ReceiveCallback,recvState); } }
这是完美的.那么,我决定构建SslAuthentication – 就像这里:
using (var client = new NetworkStream(connection.TcpSocket)) using (var sslStream = new SslStream(client,false,App_CertificateValidation)) { var clientCertificate = new X509Certificate2("client.pfx"); var clientCertificateCollection = new X509Certificate2Collection(new[] { clientCertificate }); sslStream.AuthenticateAsClient("MyServer",clientCertificateCollection,SslProtocols.Tls,false); if (sslStream.CanRead) { sslStream.BeginRead(recvState.DataBuffer,recvState); } }
其中client.pfx是没有密码的随机证书,作为项目中的文件,也导入到当前用户证书>个人> certmgr.msc中的证书.
问题是AuthenticateAsClient抛出一个
System.IO.IOException: Authentication Failed because the remote party
has closed the transport stream exception.
另外,如果AuthenticateAsCtlient方法中的主机名意味着什么,如果服务器接受每个证书?我应该把重点放在哪里吗?
我仍然可以联系服务器人员,所以我可以向他们询问一切 – 我们是否需要任何其他信息?