如何使用相同的TLS会话连接到具有数据连接的FTPS服务器? [英] How to connect to FTPS server with data connection using same TLS session?

查看:205
本文介绍了如何使用相同的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,试图理解什么不起作用我正在使用以下测试代码(尽管我在此匿名实际的主机/用户名/密码):

  final DefaultFtpsSessionFactory sessionFactory = new DefaultFtpsSessionFactory(); 
sessionFactory.setHost(XXXXXXXXX);
sessionFactory.setPort(990);
sessionFactory.setUsername(XXXXXXX);
sessionFactory.setPassword(XXXXXXX);
sessionFactory.setClientMode(2);
sessionFactory.setFileType(2);
sessionFactory.setUseClientMode(true);
sessionFactory.setImplicit(true);
sessionFactory.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
sessionFactory.setProt(P);
sessionFactory.setProtocol(TLSv1.2);
sessionFactory.setProtocols(new String [] {TLSv1.2});
sessionFactory.setSessionCreation(true);
sessionFactory.setCipherSuites(new String [] {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256});

final FtpSession session = sessionFactory.getSession();
//尝试{
final FTPFile [] ftpFiles = session.list(/);
logger.debug(FtpFiles:{},(Object [])ftpFiles);
//} catch(忽略异常){}
session.close();

我使用 -Djavax.net.debug = all打印所有TLS调试信息。



到FTPS服务器的主要控制连接工作正常,但是当它试图打开列表的数据连接(或者我尝试过的任何其他数据连接),我得到一个 javax.net.ssl.SSLHandshakeException:握手过程中远程主机关闭连接,引起的由 java.io.EOFException:SSL对等关闭不正确。如果我取消注释 session.list 命令中的swallowing-exceptions catch块,则可以看到(尽管javax.net.debug输出)服务器发送了以下消息在拒绝数据连接SSL握手之后:

  main,READ:TLSv1.2 Application Data,length = 129 
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数据连接
0020:6F 6E 20 68 61 73 20 6E 6F 74 20 72 65 73 75 6D没有资格
0030:65 64 20 6F 72 20 74 68 65 20 73 65 73 73 69 6F ed或sessio
0040:6E 20 64 6F 65 73 20 6E 6F 74 20 6D 61 74 63 68 n不符合
0050:20 74 68 65 20 63 6F 6E 74 72 6F 6C 20 63 6F 6E控制权
0060:6E 65 63 74 69 6F 6E 0D 0A nection ..

什么应用程序耳朵将会发生(这是我第一次处理FTPS,虽然我之前已经处理过普通的FTP)是因为服务器通过控制和数据连接确保身份验证和加密的方式是在正常TLS连接建立控制连接和身份验证发生在那里,每个数据连接都要求客户端连接相同的TLS会话。这对我来说很有意义,因为它应该如何工作,但Apache Commons Net FTPS实现似乎没有这样做。它似乎试图建立一个新的TLS会话,所以服务器拒绝尝试。



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



我看到三种主要的可能性:


  1. 服务器没有遵循FTPS标准要求在数据端口上使用相同的TLS会话如在控制端口上。我可以使用FileZilla 3.13.1连接到服务器(使用与我在代码中使用的主机/用户/密码相同的服务器)。服务器在登录时将自己标识为FileZilla Server 0.9.53 beta,因此这可能是某种专有的FileZilla做事方式,我需要做一些奇怪的事情来说服Java使用相同的TLS会话。 li>
  2. Apache Commons Net客户端实际上并不遵循FTPS标准,只允许一些不允许保护数据连接的子集。这看起来很奇怪,因为它似乎是从Java内部连接到FTPS的标准方式。

  3. 我完全错过了某些内容并对此进行了错误诊断。

我很感谢您提供关于如何连接到这种FTPS服务器的任何方向。谢谢。

解决方案

确实,某些FTP(S)服务器确实需要TLS / SSL会话重用于数据连接。这是一种安全措施,通过该措施,服务器可以验证数据连接是否被同一客户端用作控制连接。



常见FTP服务器的一些参考: p>

>




有什么可以帮助您执行的是Cyber​​duck FTP(S)客户端会执行su pport TLS / SSL会话重用,它使用Apache Commons Net库:

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆