代码之家  ›  专栏  ›  技术社区  ›  Greg Finzer

如何修复:由于意外的数据包格式,握手失败?

ftp
  •  4
  • Greg Finzer  · 技术社区  · 15 年前

    我正在从Windows Server 2008 R2连接到运行vsftpd 2.0.7的Linux FTP服务器。我正在通过ssl连接。

    下面是它失败的代码行:

    sslStream = new SslStream(stream, false, CertificateValidation);
    

    这是日志:

    220 (vsFTPd 2.0.7)
    AUTH SSL
    234 Proceed with negotiation.
    

    我收到以下错误:

    System.IO.IOException: The handshake failed due to an unexpected packet format.
       at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
       at KellermanSoftware.NetFtpLibrary.ProxySocket.InitSsl()
       at KellermanSoftware.NetFtpLibrary.FTP.Connect(Boolean implicitConnection)
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   ChrisLively    9 年前

    从我的google搜索来看,这似乎是vsftpd的一个常见问题。
    http://www.question-defense.com/2010/02/04/vsftpd-error-gnutls-error-9-a-tls-packet-with-unexpected-length-was-received

    你可以在那篇文章中找到解决方案的提示

    可以归结为:

    • 为ftpes配置vsftpd(使用显式tls/ssl的文件交换协议)
    • 验证是否生成了ssl证书,或者在必要时生成一个
    • 修改vsftpd.conf以允许ftpes连接/传输
    • 重新启动vsftpd以使更改生效
    • 验证您正在运行最新版本,并在必要时进行升级

    更新
    还需要检查的是: http://ftps.codeplex.com/Thread/View.aspx?ThreadId=63605 该线程通过以下代码块示例讨论隐式模式和显式模式之间的区别:

    private Stream GetDataStream()
    {
        Stream s = null;
    
        if (SslSupportCurrentMode == ESSLSupportMode.Implicit)
        {
            s = dataClient.GetStream();
        }
        else if ((sslSupportCurrentMode & ESSLSupportMode.DataChannelRequested) == ESSLSupportMode.DataChannelRequested)
        {
            if (dataSslStream == null)
                dataSslStream = CreateSSlStream(dataClient.GetStream(), false);
            s = dataSslStream;
        }
        else
        {
            s = dataClient.GetStream();
        }
    
        return s;
    }