【问题标题】:FTP Explicit fails on celluar dataFTP Explicit 在蜂窝数据上失败
【发布时间】:2014-11-23 03:50:14
【问题描述】:

这个问题是this original question 的后续问题。在与 FTP 隐式解决了一段时间后,我再次决定研究这个问题。这一次,我用纯 Java(非安卓)编写了一个简单的 FTP 客户端,并在我通过手机的热点连接到互联网时分析了 SSL/TLS 调试消息。

问题发生在发送 ClientHello 后的 TLS 握手期间。就 FTP 而言,这对应于服务器成功接受 AUTH TLS 之后。交换失败表示如下:

*** ClientHello, TLSv1.2
RandomCookie:  GMT: 1416712655 bytes = { <binary data> }
Session ID:  {}
Cipher Suites: [TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA
Extension server_name, server_name: [type=host_name (0), value=<server>]
Extension renegotiation_info, renegotiated_connection: <empty>
***
main, WRITE: TLSv1.2 Handshake, length = 188
main, handling exception: java.net.SocketTimeoutException: Read timed out
Exception in thread "main" java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
main, called close()

作为参考,成功兑换如下:

*** ClientHello, TLSv1.2
RandomCookie:  GMT: 1416713014 bytes = { <binary data> }
Session ID:  {}
Cipher Suites: [TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA
Extension server_name, server_name: [type=host_name (0), value=<server>]
Extension renegotiation_info, renegotiated_connection: <empty>
***
main, WRITE: TLSv1.2 Handshake, length = 188
main, READ: TLSv1.2 Handshake, length = 81
*** ServerHello, TLSv1.2
RandomCookie:  GMT: 142326665 bytes = { <binary data> }
Session ID:  { <session id data> }
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256
Compression Method: 0
Extension renegotiation_info, renegotiated_connection: <empty>
***

我尝试过使用 TLSv1.2、TLSv1.1 和 TLSv1,都得到了相同的结果,即套接字超时并且服务器关闭了连接。 FTP 服务器(FileZilla Server 0.9.48 beta)没有提供该问题的详细日志。

非常感谢您对此问题的任何见解。

【问题讨论】:

    标签: java ssl ftp


    【解决方案1】:

    我建议您的提供商的流量“优化”会导致问题。用于“优化”流量的深度数据包检测对于蜂窝网络非常常见,通常用于改善流量,有时也用于阻止不需要的流量。

    这与您的问题有何关系: 在蜂窝网络中,通常需要 NAT,即您没有公共 IP 地址。但是,至少 FTP 中的活动模式需要一个公共 IP,因此在 FTP 控制连接中使用为 PORT/EPRT 命令转换 IP 和端口的帮助程序并不罕见。这些帮助程序无法使用加密连接,这意味着它们要么故意阻止此类连接,要么可能会因为不再了解流量而意外阻止它们。

    【讨论】:

    • 我的场景中的所有通信都在被动模式 FTP 下运行(PASVEPSV 命令在每个数据检索/存储命令之前发送)。此外,隐式 FTP 似乎工作得很好。我不明白为什么相同的 TLS 交换在隐式运行时似乎会显式失败。
    • 无论您使用被动模式还是主动模式都没有关系,因为无法预先通知拦截设备您将在加密连接中使用被动模式。隐式 TLS 和显式 TLS 之间的区别在于显式使用与普通 FTP 相同的端口,因此会受到帮助应用程序的影响。隐式改为使用另一个可能未被提供程序拦截的端口,因为无论如何都无法重写 PORT/EPRT 命令。
    • 经过额外的测试,你说的似乎有道理。仍然让我感到困惑,他们怎么能像这样阻止流量(我住在一个互联网流量非常开放的区域,没有过滤或其他什么)。
    • 我不认为这是故意阻止的。我认为他们试图提供帮助,以便主动 FTP 工作,但随后由于有错误的帮助软件而无意中阻止了显式 FTPS。如果他们故意阻止 FTPS,那么他们也会阻止隐式 FTPS 并阻止 AUTH TLS 命令,而不是仅仅未能处理连接上的二进制数据(TLS 客户端 Hello)。
    • 从 OpenBSD 看一下 ftp-proxy 看起来至少这个助手会导致同样的问题,但其他助手可能也会。而且由于 FTPS 实际上很少见,对于大多数用户来说,如果他们在普通 FTP 上没有问题(即活动模式有效)可能会更好,即使某些用户因为 FTPS 失败而受苦。
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多