如何使用相同的TLS会话通过数据连接连接到FTPS服务器?

环境:我在64位Windows 7上使用Sun Java JDK 1.8.0_60,并使用Spring Integration 4.1.6(内部似乎使用Apache Commons Net 3.3进行FTPS访问)。

我正在尝试与我们的应用程序集成,以从客户端的FTPS服务器自动下载。我已经成功地使用Spring Integration在SFTP服务器上做到了这一点,而对其他客户端没有任何问题,没有任何问题,但这是客户端第一次要求我们使用FTPS,并且使它连接非常令人困惑。在我的实际应用程序中,我正在使用XML bean配置Spring Integration,以试图了解什么不起作用,我正在使用以下测试代码(尽管我在这里匿名了实际的主机/用户名/密码):

我正在运行此代码-Djavax.net.debug=all以获取所有TLS调试信息的打印。

与FTPS服务器的主要“控件”连接工作正常,但是当它尝试打开列表的数据连接(或我尝试的任何其他数据连接)时,出现javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake,是由引起的java.io.EOFException: SSL peer shut down incorrectly。如果我取消注释session.list命令周围的swallowing-exceptions catch块,则可以看到(尽管javax.net.debug输出)服务器在拒绝数据连接SSL握手后发送了以下消息:

main, READ: TLSv1.2 Application Data, length = 129
Padded plaintext after DECRYPTION:  len = 105
0000: 34 35 30 20 54 4C 53 20   73 65 73 73 69 6F 6E 20  450 TLS session 
0010: 6F 66 20 64 61 74 61 20   63 6F 6E 6E 65 63 74 69  of data connecti
0020: 6F 6E 20 68 61 73 20 6E   6F 74 20 72 65 73 75 6D  on has not resum
0030: 65 64 20 6F 72 20 74 68   65 20 73 65 73 73 69 6F  ed or the sessio
0040: 6E 20 64 6F 65 73 20 6E   6F 74 20 6D 61 74 63 68  n does not match
0050: 20 74 68 65 20 63 6F 6E   74 72 6F 6C 20 63 6F 6E   the control con
0060: 6E 65 63 74 69 6F 6E 0D   0A                       nection..

基于这个有关在JSSE中恢复SSL会话的问题,看来Java为每个主机/帖子组合假定或要求一个不同的会话。我的假设是,由于FTPS数据连接与控制连接位于不同的端口上,因此它找不到现有会话并试图建立一个新会话,因此连接失败。

我看到三种主要可能性:

  1. 服务器在数据端口和控制端口上要求相同的TLS会话时未遵循FTPS标准。我可以使用FileZilla 3.13.1正常连接服务器(使用与我在代码中尝试使用的主机/用户/密码相同的主机)。服务器在登录时将自己标识为“ FileZilla Server 0.9.53 beta”,因此也许这是某种FileZilla专有的处理方式,我需要做一些奇怪的事情才能说服Java使用相同的TLS会话。

  2. Apache Commons Net客户端实际上并不遵循FTPS标准,而仅允许某些子集,而这些子集不允许保护数据连接。这似乎很奇怪,因为它似乎是从Java内部连接到FTPS的标准方法。

  3. 我完全错过了一些东西,并且误诊了。

对于可以如何连接到这种FTPS服务器的任何指示,我将不胜感激。谢谢。


慕村9548890
浏览 1054回答 3
3回答

12345678_0001

为了使Martin Prikryl的建议对我有用,我不仅必须将密钥存储在,socket.getInetAddress().getHostName()而且还必须将其存储在socket.getInetAddress().getHostAddress()。(解决方案是从这里偷来的。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java