Java FTPS连接禁用证书校验:解决过期证书导致的连接失败问题
Java FTPS连接跳过过期证书校验的解决方案
没问题,咱们来解决这个Java下FTPS连接的证书问题。Java的SSL机制默认会严格校验证书的有效性(包括是否过期),但WINSCP这类客户端允许手动接受过期证书——而你用的Apache Commons Net的FTPSClient默认不会跳过这个校验,所以才会抛出CertificateExpiredException。既然服务器管理员不管证书的事,那我们就通过自定义信任管理器来绕开校验。
第一步:编写信任所有证书的自定义TrustManager
我们需要实现X509TrustManager接口,让它完全忽略证书的有效性检查:
import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public class TrustAllCertificates implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { // 不校验客户端证书,直接信任 } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { // 不校验服务器证书,包括过期、不匹配主机名的情况,全部信任 } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }
第二步:给FTPSClient配置自定义SSL上下文
接下来要创建一个使用上述信任管理器的SSL上下文,然后把它绑定到FTPSClient上:
import org.apache.commons.net.ftp.FTPSClient; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; public class FTPSConnectionExample { public static void main(String[] args) { FTPSClient ftpsClient = new FTPSClient(); try { // 初始化信任所有证书的SSL上下文 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init( null, // 不需要自定义密钥管理器 new TrustManager[]{new TrustAllCertificates()}, // 注入我们的信任管理器 new java.security.SecureRandom() // 默认的随机源 ); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); // 给FTPSClient设置自定义的SSLSocketFactory ftpsClient.setSSLSocketFactory(sslSocketFactory); // 连接FTPS服务器(端口根据实际情况调整,隐式FTPS默认990,显式是21) ftpsClient.connect("your-ftps-server-address", 990); ftpsClient.login("your-username", "your-password"); // 这里可以添加你的业务逻辑,比如下载文件 System.out.println("FTPS连接成功!"); // 用完记得关闭连接 ftpsClient.logout(); ftpsClient.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
重要注意事项
- 安全风险提示:这种方式会完全跳过所有证书校验,意味着你的连接可能被中间人攻击,只建议在测试环境或者你100%信任的内部服务器使用。生产环境下,强烈建议让服务器管理员更新有效证书。
- 如果你的FTPS是显式模式(先连接21端口,再升级SSL),代码逻辑基本一致,只需把连接端口改成21,部分情况下可能需要调用
ftpsClient.execPROT("P")来指定数据连接的保护级别,具体看服务器配置。 - 确保你使用的Apache Commons Net版本是较新的,避免旧版本存在的SSL相关bug。
内容的提问来源于stack exchange,提问作者Akira Hora
相关产品推荐
相关产品推荐

