Rumah >Java >javaTutorial >Bagaimana untuk Menggunakan Semula Sesi TLS untuk Sambungan Data dalam FTPS dengan Apache Commons Net?

Bagaimana untuk Menggunakan Semula Sesi TLS untuk Sambungan Data dalam FTPS dengan Apache Commons Net?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-11 22:42:03345semak imbas

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

Cara Menyambung ke Pelayan FTPS dengan Sambungan Data Menggunakan Sesi TLS yang Sama

Pelaksanaan FTPS Net Apache Commons tidak menggunakan semula TLS secara automatik sesi untuk sambungan data apabila menyambung ke pelayan FTPS tertentu. Ini boleh menyebabkan ralat jabat tangan TLS apabila sambungan data dicuba.

Untuk memastikan sambungan data menggunakan sesi TLS yang sama seperti sambungan kawalan:

  1. Semak sama ada FTPS pelayan menyokong penggunaan semula sesi TLS: Sesetengah pelayan, seperti Pelayan FileZilla, menguatkuasakan penggunaan semula sesi TLS untuk sambungan data.
  2. Gunakan semula sesi menggunakan kod tersuai: Anda boleh mengatasi _prepareDataSocket_ kaedah dalam kelas FTPSClient untuk menetapkan sesi secara manual untuk sambungan data.
@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. Override Spring Integration's createClientInstance(): Cipta kilang tersuai yang mengembalikan FTPSClient dengan _prepareDataSocket_ override.
  2. Tetapkan jdk.tls.useExtendedMasterSecret kepada false (Java 8u161 dan ke atas): Ini ialah penyelesaian untuk SSLHandshakeException dalam JDK 8u161.
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");

Atas ialah kandungan terperinci Bagaimana untuk Menggunakan Semula Sesi TLS untuk Sambungan Data dalam FTPS dengan Apache Commons Net?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn