Heim  >  Artikel  >  Java  >  Wie kann ich die TLS-Sitzung für Datenverbindungen in FTPS mit Apache Commons Net wiederverwenden?

Wie kann ich die TLS-Sitzung für Datenverbindungen in FTPS mit Apache Commons Net wiederverwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-11 22:42:03279Durchsuche

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

So stellen Sie eine Verbindung zum FTPS-Server mit Datenverbindung über dieselbe TLS-Sitzung her

Die Apache Commons Net FTPS-Implementierung verwendet TLS nicht automatisch wieder Sitzung für Datenverbindungen beim Herstellen einer Verbindung zu bestimmten FTPS-Servern. Dies kann zu TLS-Handshake-Fehlern führen, wenn versucht wird, eine Datenverbindung herzustellen.

Um sicherzustellen, dass die Datenverbindung dieselbe TLS-Sitzung wie die Steuerverbindung verwendet:

  1. Überprüfen Sie, ob die FTPS Server unterstützt die Wiederverwendung von TLS-Sitzungen: Einige Server, wie z. B. FileZilla Server, erzwingen die Wiederverwendung von TLS-Sitzungen für die Daten Verbindungen.
  2. Verwenden Sie die Sitzung mit benutzerdefiniertem Code wieder: Sie können die _prepareDataSocket_-Methode in der FTPSClient-Klasse überschreiben, um die Sitzung für die Datenverbindung manuell festzulegen.
@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. createClientInstance() von Spring Integration überschreiben: Erstellen Sie eine benutzerdefinierte Factory, die den FTPSClient mit der _prepareDataSocket_-Überschreibung zurückgibt.
  2. Setzen Sie jdk.tls.useExtendedMasterSecret auf false (Java 8u161 und höher): Dies ist eine Problemumgehung für SSLHandshakeException in JDK 8u161.
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");

Das obige ist der detaillierte Inhalt vonWie kann ich die TLS-Sitzung für Datenverbindungen in FTPS mit Apache Commons Net wiederverwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn