Maison >Java >javaDidacticiel >Comment résoudre les problèmes de réutilisation de session TLS dans les clients FTPS Java ?

Comment résoudre les problèmes de réutilisation de session TLS dans les clients FTPS Java ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-09 04:06:02533parcourir

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

Résolution du problème de réutilisation de session TLS pour la connexion de données FTPS

Lors de l'établissement d'une connexion FTPS, il est crucial que la connexion de données réutilise le TLS session établie pour la connexion de contrôle. Cela garantit que le serveur vérifie l'identité du client pour les deux connexions. Cependant, certains serveurs FTP(S), dont FileZilla, appliquent cette exigence.

La bibliothèque Apache Commons Net, utilisée par de nombreux clients Java FTPS, ne dispose pas de cette fonctionnalité de réutilisation de session. Pour surmonter cette limitation, il est recommandé d'inspecter l'implémentation du client Cyberduck FTP(S), qui prend en charge la réutilisation des sessions TLS/SSL.

Concentrez-vous en particulier sur la méthode prepareDataSocket dans FTPClient.java. Cette méthode permet de réutiliser la session TLS/SSL de la connexion de contrôle pour la connexion de données.

Voici un exemple de méthode 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));
            }
        }
    }
}

Cette méthode garantit que la session TLS/SSL de la connexion de contrôle est réutilisée pour les données connexion.

Considérations supplémentaires :

Dans Java 8u161 et versions ultérieures, vous pouvez rencontrer des conflits avec la prise en charge de l'extension de secret principal étendu. Pour atténuer ce problème, désactivez cette extension en définissant la propriété système jdk.tls.useExtendedMasterSecret sur false.

Si vous continuez à rencontrer des problèmes, reportez-vous au ticket Jira NET-408 pour une implémentation alternative et d'autres informations pertinentes.

En mettant en œuvre ces étapes et en tirant parti de la mise en œuvre du client Cyberduck FTP(S), vous pouvez établir des connexions FTPS avec réutilisation de session TLS, réunion les exigences du serveur FTPS de votre client.

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!

Déclaration:
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