我们公司已从TLS 1.0升级到TLS 1.2。在此之前,我们曾经使用org.apache.commons.net.ftp.FTPClient
下载文件。
现在,我们无法使用FTPSclent
连接到服务器,并且出现异常:
org.apache.commons.net.ftp.FTPConnectionClosedException
:连接已关闭,无提示
如何正确连接到服务器。
完整堆栈跟踪:
答案 0 :(得分:2)
首先,打开on SSL调试,因为javadoc提示并尝试连接,然后检查输出(默认情况下它记录为std,您应该将其重定向到文件)。
排序器答案
尝试使用-Dhttps.protocols=TLSv1.2
JVM参数(应该将其传递给您在调查期间使用的每个Java代码,并且当然也必须使用相同的JRE)。
如果不起作用,请检查服务器证书,该证书应安装到JRE的默认密钥库(证书)或您可能使用的自定义密钥库中。
如果这样做没有帮助,请安装JCE扩展名(如果没有JCE,JRE无法处理具有至少2048位密钥的证书)。
如果所有这些步骤都没有用,那么您可能会遇到与此guy相同的问题。
较长的版本
我希望您至少使用Java7(请参阅每个平台上可用协议的表)。
第一件事是服务器支持的TLS协议和应用程序支持的TLS协议必须相交。
在此table中,您可以找到不同JRE版本的默认TLS协议,这很重要,因为您的客户端很可能使用JRE的默认TLS。
因此,在检查了JRE并找到了受支持的TLS版本之后,您应该检查所应用的密码。
您应该使用nmap测试连接:
nmap.exe --script ssl-enum-ciphers -p <port> <ftp host>
使用此工具,您可以列出TLS版本和使用的密码。可以将密码列表与该小型Java code提供的列表进行比较。为了能够进行交流,这两个列表必须至少具有一个共同点。
您可以使用Portecle下载服务器的证书,该证书应安装在客户端JRE的密钥库中。
如果您发现它们在TLS协议和密码中也有交集,则您的密钥库中具有正确的证书,则可以测试它们是否可以与之通信 SSLPoke
如果这也可行,那么问题应该出在FTPClient。