Tag: ftps

JDK 8u161中Apache FTPS客户端中的SSL会话重用

使用Apache Commons-Net的FTPSClient连接到现代FTP / S服务器不起作用。 原因是它们需要重用SSL会话,即需要重新使用来自控制连接的SSL会话进行数据连接。 这通常可以在服务器中停用,但也就是说 不安全 并不总是一个选项(因为服务器可能不在您的控制之下) 正确的解决方案是让客户端实际重用会话。 Commons-Net存在一个漏洞 ,但看起来不会很快得到解决。 此外,还有一个由Cyber​​duck(一个FTP客户端应用程序)的作者创建的“reflection黑客”,它在他们的bugtracker中进行了描述,并且在博客文章中更深入地描述。 StackOverflow上还有一篇相关文章描述了这个解决方案。 他们使用reflection来访问JDK的SSLSessionContext的内部缓存并注入一个新条目。 这个hack工作正常,直到JDK 8u161和9.0.4(?),其中引入了对更改日志中描述的SSL的一些更改。 显然,一些实现细节已经改变,导致黑客不再工作。 据我所知,现在有以下选项: 继续使用JDK 8u152,直到有人找到解决方案/ apache-commons-net得到修补/ JDK更改被回滚(不是真正的选项,因为这会切断生产系统的安全更新) 使用不同的FTPS客户端(我能找到的唯一替代方案是专有且非常昂贵) 尝试对SSLSessionContext实现的更改进行反向工程以查找新的解决方法。 这看起来不仅仅是一项非常重要的任务 – 解决方案可能会再次成为黑客,因此可能随时再次破裂。 不要再使用FTP / S. 谁能建议如何在这里继续? 相关链接: http://mail.openjdk.java.net/pipermail/security-dev/2016-December/015254.html https://bugs.openjdk.java.net/browse/JDK-8170813 https://issues.apache.org/jira/browse/NET-426

如何使用apache.commons.net.ftps配置客户端身份validation?

我使用apache.commons.net -framework在java中实现了FTPS客户端(FTP over SSL / TLS)。 它被配置为在默认端口21上执行显式安全性。 ftpsClient = new FTPSClient(false); ftpsClient.setTrustManager(getConfiguration().getCertificatesManager()); ftpsClient.connect(getConfiguration().getHostName(), getConfiguration().getPort()); 只要我不在服务器上强制执行客户端身份validation,一切正常。 但我需要启用客户端身份validation,因此我在服务器上强制执行它并配置客户端系统属性: -Djavax.net.ssl.keyStore=”D:/…/ftps-client-auth.keystore” -Djavax.net.ssl.keyStorePassword=”*****” -Djavax.net.ssl.keyStoreType=JKS 我得到的就像没有设置系统属性一样: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1806) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:986) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181) at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:265) at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:207) at org.apache.commons.net.SocketClient.connect(SocketClient.java:172) at org.apache.commons.net.SocketClient.connect(SocketClient.java:192) 服务器日志说: DEBUG: Client “”, “SSL_accept failed: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer […]

Java ftps连接,TrustManager解释(使用filezilla服务器)

我已经编写了一个程序(显然是从网上COPIED,并根据我的需要进行了一些修改!),使用apache ftp api进行文件下载/上传,并使用Filezilla服务器创建本地服务器。 一切都很好 。 问题是我没有得到我们必须创建信任管理器的部分。 码: FTPSClient ftpsClient= null; SSLContext sslContext = SSLContext.getInstance(protocol); TrustManager tm = new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { System.out.println(“getAcceptedIssuers——“); return null; } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub System.out.println(“checkClientTrusted——“); } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { […]

commons-net FTPSClient的替代方案?

除了Apache commons-net FTPSClient之外 ,您是否知道任何优秀的开源库与FTPS站点进行交互 问候,

FTPSClient返回MalformedServerReplyException:无法解析响应代码

我有一个SFTP连接设置。 我使用WinCSP和Filezilla,测试服务器没有问题。 java代码来自apache commons-net 2.0 ,它给了我意想不到的错误 码 private String ftpServer=”XXX.xx.x.XX”; private int ftpPort=99; private String ftpUserName=”myUserName”; private String ftpPassword=”myPassword”; FTPSClient ftp = null; try{ ftp = new FTPSClient(); ftp.connect(hostname, port) } catch (Exception e){ Logger.debug(e) } 堆栈跟踪 Server reply:SSH-2.0-WeOnlyDo-wodFTPD 2.3.6.165 org.apache.commons.net.MalformedServerReplyException: Could not parse response code. at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:315) at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:364) at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:540) at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:167) at […]

如何在apache-commons net中使用生成的证书配置客户端身份validation

首先,我知道这里有一个类似的问题,但它没有回答我的怀疑。 我有一个配置了SSL的FTPS服务器(vsftpd)。 我已经生成了适当的键: openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \ -keyout private/vsftpd.key \ -out certs/vsftpd.crt 并在服务器中配置相应的conf文件。 现在,在使用Apache commons net的Java客户端代码中,我能够通过SSL与服务器通信,如下所示: import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPReply; import org.apache.commons.net.ftp.FTPSClient; public class CommonsNetFTPSTest { public static void main(String[] args) throws Exception { System.setProperty(“javax.net.debug”, “ssl”); String server = “XXX.XXX.XXX.XXX”; String username […]

如何通过Java中的TLS / SSL(FTPS)服务器连接到FTP

我搜索了SO,谷歌搜索超过2天,并没有找到任何帮助我的答案。 我坚持通过TLS / SSL(FTPS)服务器连接到FTP。 我正在使用SimpleFTP库,因为我可以连接没有SSL的FTP服务器,但无法连接FTPS。 它在第2行(ftp.connect)给我这个错误, 连接到FTP服务器时,SimpleFTP收到未知响应: 220 ———-欢迎来到Pure-FTPd [privsep] [TLS] ———- 并使用下面的代码 SimpleFTP ftp = new SimpleFTP(); // Connect to an FTP server on port 21. ftp.connect(“xxx.xxx.xxx.xxx”, 21, “username”, “pwd”); //getting error at (ftp.connect) above line // Set binary mode. ftp.bin(); // Change to a new working directory on the FTP server. ftp.cwd(“web”); ftp.disconnect();

如何使用相同的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成功完成了使用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(); //try { final FTPFile[] ftpFiles = session.list(“/”); logger.debug(“FtpFiles: {}”, (Object[]) ftpFiles); […]