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 の設定は、Commons Net の日付だけに基づく証明書チェックではなく、JVM の既定の trust manager を選択します。意図した trust store と、サーバー証明書のホスト名を使用してください。

パッシブ転送では、現在の FTPSClient 実装はデータソケットも構成済みのプロキシ経由で作成し、その後に TLS レイヤーを追加します。ログイン後はパッシブモードを使い、通常の FTPS API で必要な保護データチャネルをネゴシエートしてください。制御接続の成功だけではその作業は完了しません。 パッシブなデータ接続は別の経路のままです。

コードは追加アカウントのない SOCKS サービスを前提としています。認証のサポートは、選択した Java ランタイムと配備について別途検討が必要です。

これは FTPHTTPClient の HTTP CONNECT インターフェースではありません。そちらの兄弟は通常の FTP を HTTP トンネル経由で扱います。ポートを変えても FTPS は追加されません。ネットワークが HTTP プロキシしか許可しない場合は、制御経路とデータ経路の両方で CONNECT をサポートする FTPS 実装または保守された適応を選んでください。

プロキシ設定はクライアントのライフサイクル全体で保持し、再利用するインスタンスを再接続する前に見直してください。FTPS の切断はソケットファクトリーをリセットします。経路が成功したように見せるために、証明書チェックを trust-all manager に置き換えないでください。

関連記事