You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:44