远程方已关闭传输流,身份验证失败. 服务器模式 SSL 必须使用具有关联私钥的证书.
  我用VS命令行工具执行makecert创建了一个证书,然后创建了两个winform,一个做服务端一个做客户端,可以互相通讯,然后我把服务端的源码放到一个Windows服务中,在系统中安装该服务,在用那个客户端访问监听的端口,此时出现错误
  客户端显示的信息是由于远程方已关闭传输流,身份验证失败。当调试Windows服务时,服务捕获到异常信息,信息内容为:服务器模式 SSL 必须使用具有关联私钥的证书。
   有人知道什么原因吗?怎么解决
ssl

3个回答

已解决。解决方案:
在服务端建立X509凭证时使用X509Certificate2,而不是X509Certificate。
根据代码调试可以看出,在执行证书验证时直接catch到了异常,就是服务器模式 SSL 必须使用具有关联私钥的证书,在catch中关闭了传输流,所以客户端收到返回值远程方已关闭传输流,身份验证失败。

附源码
服务器端源码如下:
///
/// 执行服务器监听
///
public static void RunServer()
{
// 建立X509凭证
ServerCertificate = new X509Certificate(Certificate, "123456");
// 监听任何IP Address来的讯息
listener = new TcpListener(System.Net.IPAddress.Any, 17170);
// 开启监听
listener.Start();

        while (IsRun)
        {
            TcpClient client = listener.AcceptTcpClient();

            if (!IsRun)
            {
                listener.Stop();
                client.Close();
            }
            else
            {
                ProcessClient(client);
            }
        }
    }

            /// <summary>
    /// 接收客户端讯息处理并回复
    /// </summary>
    /// <param name="pClient"></param>
    private static void ProcessClient(TcpClient pClient)
    {
        SslStream sslStream = new SslStream(pClient.GetStream(), true);

        try
        {
            sslStream.AuthenticateAsServer(ServerCertificate, true, SslProtocols.Tls, true);

            sslStream.ReadTimeout = 5000;
            sslStream.WriteTimeout = 5000;

            string messageData = ReadMessage(sslStream);

            byte[] message = Encoding.UTF8.GetBytes(string.Format("服务器已接收此: {0} 讯息<EOF>", messageData));

            sslStream.Write(message);
        }
        catch (Exception e)
        {
            sslStream.Close();
            pClient.Close();
            return;
        }
        finally
        {
            sslStream.Close();
            pClient.Close();
        }
    }

证书验证是否失败了,证书生成正确吗

hanghuoyoupan
行货优盘 makecert -r -pe -n "CN=SslSocket" -ss My -sky exchange 这个是我创建证书用的语句,创建成功后再导出服务器端用的pfx文件及客户端用的cer文件
接近 4 年之前 回复
hanghuoyoupan
行货优盘 就是在执行服务端sslStream.AuthenticateAsServer(ServerCertificate, true, SslProtocols.Tls, true);是捕获到了异常,提示服务器模式 SSL 必须使用具有关联私钥的证书.应该是证书验证失败了,证书是我自己用makecert创建的测试证书,这个服务器证书必须申请吗?
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐