我正在尝试连接基于Java Netty的服务器,该服务器会自动生成证书(服务器人员告诉我,目前接受来自客户端的任何证书)。
我的任务是将TcpSocket连接迁移到Tls加密连接。
首先,我将TcpSocket转换为NetworkStream:
using (var client = new NetworkStream(connection.TcpSocket))
{
if (client.CanRead)
{
client.BeginRead(recvState.DataBuffer, 0, 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, 0, recvState.DataBuffer.Length, ReceiveCallback,
recvState);
}
}
在项目中,client.pfx
是一个没有密码的随机证书文件,同时也被导入到了 certmgr.msc
中的 Current User Certificates > Personal > Certificates
。
问题是,在使用 AuthenticateAsClient 方法时会抛出以下异常:
System.IO.IOException: Authentication failed because the remote party has closed the transport stream exception.
另外,如果 AuthenticateAsCtlient 方法中的主机名有任何意义,那么如果服务器接受每个证书,我应该放置一些重要的东西吗?
我仍然可以与服务器人员联系,所以我可以问他们关于所有信息 - 我们需要任何其他信息吗?