Apache Commons Net を使用した FTPS でのデータ接続に TLS セッションを再利用するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-11 22:42:03
オリジナル
334 人が閲覧しました

How to Reuse the TLS Session for Data Connections in FTPS with Apache Commons Net?

同じ TLS セッションを使用したデータ接続で FTPS サーバーに接続する方法

Apache Commons Net FTPS 実装では、TLS が自動的に再利用されません特定の FTPS サーバーに接続するときのデータ接続のセッション。これにより、データ接続を試行するときに TLS ハンドシェイク エラーが発生する可能性があります。

データ接続が制御接続と同じ TLS セッションを使用していることを確認するには:

  1. FTPS がサーバーは TLS セッションの再利用をサポートしています: FileZilla Server などの一部のサーバーは、データに対して TLS セッションの再利用を強制します
  2. カスタム コードを使用してセッションを再利用します。 FTPSClient クラスの _prepareDataSocket_ メソッドをオーバーライドして、データ接続のセッションを手動で設定できます。
@Override
protected void _prepareDataSocket_(final Socket socket) {
    if(preferences.getBoolean("ftp.tls.session.requirereuse")) {
        if(socket instanceof SSLSocket) {
            // Control socket is SSL
            final SSLSession session = ((SSLSocket) _socket_).getSession();
            if (session.isValid()) {
                final SSLSessionContext context = session.getSessionContext();
                context.setSessionCacheSize(preferences.getInteger("ftp.ssl.session.cache.size"));
                try {
                    final Field sessionHostPortCache = context.getClass().getDeclaredField("sessionsByHostAndPort");
                    sessionHostPortCache.setAccessible(true);
                    final Object cache = sessionHostPortCache.get(context);
                    final Method putMethod = cache.getClass().getDeclaredMethod("put", Object.class, Object.class);
                    putMethod.setAccessible(true);
                    Method getHostMethod;
                    try {
                        getHostMethod = socket.getClass().getMethod("getPeerHost");
                    } catch (NoSuchMethodException e) {
                        // Running in IKVM
                        getHostMethod = socket.getClass().getDeclaredMethod("getHost");
                    }
                    getHostMethod.setAccessible(true);
                    Object peerHost = getHostMethod.invoke(socket);
                    putMethod.invoke(cache, String.format("%s:%s", peerHost, socket.getPort()).toLowerCase(Locale.ROOT), session);
                } catch (NoSuchFieldException e) {
                    // Not running in expected JRE
                    log.warn("No field sessionsByHostAndPort in SSLSessionContext", e);
                } catch (Exception e) {
                    // Not running in expected JRE
                    log.warn(e.getMessage());
                }
            } else {
                log.warn(String.format("SSL session %s for socket %s is not rejoinable", session, socket));
            }
        }
    }
}
ログイン後にコピー
  1. Spring Integration のオーバーライドcreateClientInstance(): _prepareDataSocket_ override を使用して FTPSClient を返すカスタム ファクトリを作成します。
  2. jdk.tls.useExtendedMasterSecret を false に設定します (Java 8u161 以降): これはJDK での SSLHandshakeException の回避策8u161.
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
ログイン後にコピー

以上がApache Commons Net を使用した FTPS でのデータ接続に TLS セッションを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート