Rumah >Java >javaTutorial >Bagaimana untuk Menyelesaikan Isu Penggunaan Semula Sesi TLS dalam Pelanggan FTPS Java?

Bagaimana untuk Menyelesaikan Isu Penggunaan Semula Sesi TLS dalam Pelanggan FTPS Java?

Linda Hamilton
Linda Hamiltonasal
2024-11-09 04:06:02537semak imbas

How to Resolve TLS Session Reuse Issues in Java FTPS Clients?

Menyelesaikan Isu Penggunaan Semula Sesi TLS untuk Sambungan Data FTPS

Apabila membuat sambungan FTPS, adalah penting untuk sambungan data menggunakan semula TLS sesi yang ditubuhkan untuk sambungan kawalan. Ini memastikan pelayan mengesahkan identiti pelanggan untuk kedua-dua sambungan. Walau bagaimanapun, beberapa pelayan FTP(S), termasuk FileZilla, menguatkuasakan keperluan ini.

Pustaka Apache Commons Net, yang digunakan oleh banyak pelanggan FTPS Java, tidak mempunyai ciri penggunaan semula sesi ini. Untuk mengatasi had ini, adalah disyorkan untuk memeriksa pelaksanaan klien Cyberduck FTP(S), yang menyokong penggunaan semula sesi TLS/SSL.

Khususnya, fokus pada kaedah prepareDataSocket dalam FTPClient.java. Kaedah ini membenarkan penggunaan semula sesi TLS/SSL daripada sambungan kawalan untuk sambungan data.

Berikut ialah contoh kaedah 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("sessionHostPortCache");
                    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 sessionHostPortCache 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));
            }
        }
    }
}

Kaedah ini memastikan sesi TLS/SSL daripada sambungan kawalan digunakan semula untuk sambungan data.

Pertimbangan Tambahan:

Dalam Java 8u161 dan kemudian, anda mungkin menghadapi konflik dengan sokongan sambungan rahsia induk yang dilanjutkan. Untuk mengurangkannya, lumpuhkan sambungan ini dengan menetapkan sifat sistem jdk.tls.useExtendedMasterSecret kepada palsu.

Jika anda terus mengalami masalah, rujuk tiket Jira NET-408 untuk pelaksanaan alternatif dan maklumat lain yang berkaitan.

Dengan melaksanakan langkah-langkah ini dan memanfaatkan pelaksanaan klien Cyberduck FTP(S), anda boleh mewujudkan sambungan FTPS dengan penggunaan semula sesi TLS, memenuhi keperluan pelayan FTPS pelanggan anda.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Isu Penggunaan Semula Sesi TLS dalam Pelanggan FTPS Java?. 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