WPF中的套接字和身份验证失败,因为远程方关闭了传输流异常。

6

我正在尝试连接基于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 方法中的主机名有任何意义,那么如果服务器接受每个证书,我应该放置一些重要的东西吗?

我仍然可以与服务器人员联系,所以我可以问他们关于所有信息 - 我们需要任何其他信息吗?


你解决了吗?我这里也遇到了同样的情况。谢谢。 - Gutemberg Ribeiro
不行,还在等待帮助。 - Zozo
1个回答

6

搞定了。

托管套接字服务器的服务器必须在其证书存储中安装带有私钥的证书。如果您仅安装证书或仅安装公钥,则会出现身份验证失败的错误。

希望能对你有所帮助。


我将把这个答案转交给我们的服务器团队。谢谢! - Zozo
我的应用程序发送邮件8到10个小时,然后抛出此异常:“身份验证失败,因为远程方已关闭传输流。”如何处理这种情况?请帮忙。 - Rajdeep Paliwal
兄弟,你的这篇帖子真是救了我一命。非常感谢!如果可以的话,我现在就会全部把我的声望点数都给你!哈哈! - Brandon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接