Maison > Java > javaDidacticiel > Comment réutiliser la session TLS pour les connexions de données dans FTPS avec Apache Commons Net ?

Comment réutiliser la session TLS pour les connexions de données dans FTPS avec Apache Commons Net ?

Mary-Kate Olsen
Libérer: 2024-11-11 22:42:03
original
378 Les gens l'ont consulté

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

Comment se connecter au serveur FTPS avec une connexion de données en utilisant la même session TLS

L'implémentation FTPS d'Apache Commons Net ne réutilise pas automatiquement le TLS session pour les connexions de données lors de la connexion à certains serveurs FTPS. Cela peut provoquer des erreurs de négociation TLS lors de la tentative de connexion de données.

Pour garantir que la connexion de données utilise la même session TLS que la connexion de contrôle :

  1. Vérifiez si le FTPS Le serveur prend en charge la réutilisation de session TLS : Certains serveurs, tels que FileZilla Server, imposent la réutilisation de session TLS pour les connexions de données.
  2. Réutilisez la session à l'aide d'un code personnalisé : Vous pouvez remplacer _prepareDataSocket_ dans la classe FTPSClient pour définir manuellement la session pour la connexion de données.
@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));
            }
        }
    }
}
Copier après la connexion
  1. Remplacez createClientInstance() de Spring Integration : Créez une usine personnalisée qui renvoie le FTPSClient avec le remplacement _prepareDataSocket_.
  2. Définissez jdk.tls.useExtendedMasterSecret sur false (Java 8u161 et supérieur) : Il s'agit d'une solution de contournement pour SSLHandshakeException dans JDK 8u161.
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal