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!