为 Commons Net 的 FTPSClient 提供 SOCKS 通路
在保留服务器主机名、被动数据连接和 TLS 校验的前提下,为 FTPS 使用 Commons Net 的套接字代理接口。
当有 SOCKS 中间层可用时,Commons Net 的 FTPSClient 可以使用继承而来的套接字代理接口。请把 FTPS 服务器保留为连接目标:
var client = new org.apache.commons.net.ftp.FTPSClient(false);
client.setProxy(new java.net.Proxy(
java.net.Proxy.Type.SOCKS,
new java.net.InetSocketAddress("proxy.example", 1080)));
client.setTrustManager(null);
client.setEndpointCheckingEnabled(true);
client.setConnectTimeout(10000);
client.connect("ftps.example", 21);
这会启动一个显式 FTPS 连接。登录、数据保护协商、传输处理和断开仍由应用负责。null trust manager 设置选择 JVM 的默认信任管理器,而不是 Commons Net 仅按日期进行的证书检查。请使用既定的信任库和服务器证书的主机名。
对于被动传输,当前的 FTPSClient 实现也会通过已配置的代理创建其数据套接字,然后再加上 TLS 层。登录后,请使用被动模式,并通过常规 FTPS API 协商所需的受保护数据通道。控制连接成功并不意味着这项工作完成; 被动数据连接仍是单独的一条路径。
代码假定 SOCKS 服务不需要额外账户。身份验证支持需要针对所选的 Java 运行时和部署单独审查。
这不是 FTPHTTPClient 的 HTTP CONNECT 接口。那个同类通过 HTTP 隧道处理普通 FTP;改动其端口并不会增加 FTPS。如果网络只允许 HTTP 代理,请选择在控制通道和数据通道上都支持 CONNECT 的 FTPS 实现或仍在维护的适配方案。
在客户端整个生命周期内保留代理配置,并在重新连接复用的实例之前复查它:FTPS 断开连接会重置套接字工厂。不要为了让它看起来成功而用全信任管理器替换证书检查。