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
Lepaskan: 2024-11-11 22:42:03
asal
378 orang telah melayarinya

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));
            }
        }
    }
}
Salin selepas log masuk
  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");
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan