Comment faire pour se connecter au serveur FTPS avec la connexion de données à l'aide de la même session TLS?

De l'environnement: je suis à l'aide de Sun Java JDK 1.8.0_60 sur une version 64 bits de Windows 7, l'utilisation de Spring Integration 4.1.6 (qui à l'interne s'affiche à l'utilisation d'Apache Commons Net de 3,3 pour les PTS d'accès).

Je suis d'essayer de l'intégrer à notre demande un téléchargement automatique de notre client FTP server. Je l'ai fait avec tant de succès par SFTP serveurs à l'aide de Spring Integration, sans aucun problème pour d'autres clients sans problèmes, mais c'est la première fois qu'un client nous a conduits à utiliser FTPS, et de le faire pour se connecter a été très surprenant. Alors que dans mon application, je suis à la configuration de Spring Integration à l'aide de XML haricots, pour essayer de comprendre ce qui ne marche pas, je suis en utilisant le test code suivant (même si je suis de préservation de l'anonymat de l'hôte/nom d'utilisateur/mot de passe):

final DefaultFtpsSessionFactory sessionFactory = new DefaultFtpsSessionFactory();
sessionFactory.setHost("XXXXXXXXX");
sessionFactory.setPort(990);
sessionFactory.setUsername("XXXXXXX");
sessionFactory.setPassword("XXXXXXX");
sessionFactory.setClientMode(2);
sessionFactory.setFileType(2);
sessionFactory.setUseClientMode(true);
sessionFactory.setImplicit(true);
sessionFactory.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
sessionFactory.setProt("P");
sessionFactory.setProtocol("TLSv1.2");
sessionFactory.setProtocols(new String[]{"TLSv1.2"});
sessionFactory.setSessionCreation(true);
sessionFactory.setCipherSuites(new String[]{"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"});

final FtpSession session = sessionFactory.getSession();
//try {
    final FTPFile[] ftpFiles = session.list("/");
    logger.debug("FtpFiles: {}", (Object[]) ftpFiles);
//} catch (Exception ignored ) {}
session.close();

J'exécute ce code avec -Djavax.net.debug=all pour obtenir toutes les TLS informations de débogage imprimé.

La principale "control" connexion au serveur FTPS fonctionne bien, mais quand il tente d'ouvrir la connexion de données pour la liste (ou de toute autre connexion de données, j'ai essayé), j'obtiens un javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake, causée par java.io.EOFException: SSL peer shut down incorrectly. Si je décommentez la déglutition-exceptions bloc catch autour de la session.list commande, alors je peux voir (bien que le javax.net.la sortie de débogage) que le serveur a envoyé le message suivant après avoir rejeté la connexion de données handshake SSL:

main, READ: TLSv1.2 Application Data, length = 129
Padded plaintext after DECRYPTION:  len = 105
0000: 34 35 30 20 54 4C 53 20   73 65 73 73 69 6F 6E 20  450 TLS session 
0010: 6F 66 20 64 61 74 61 20   63 6F 6E 6E 65 63 74 69  of data connecti
0020: 6F 6E 20 68 61 73 20 6E   6F 74 20 72 65 73 75 6D  on has not resum
0030: 65 64 20 6F 72 20 74 68   65 20 73 65 73 73 69 6F  ed or the sessio
0040: 6E 20 64 6F 65 73 20 6E   6F 74 20 6D 61 74 63 68  n does not match
0050: 20 74 68 65 20 63 6F 6E   74 72 6F 6C 20 63 6F 6E   the control con
0060: 6E 65 63 74 69 6F 6E 0D   0A                       nection..

Ce qui semble être le cas (et c'est ma première fois avec FTPS, bien que je l'ai traité avec du simple client FTP), c'est que la manière dont le serveur assure l'authentification et le chiffrement à la fois sur le contrôle et les connexions de données est que, après un "normal" connexion TLS pour établir la connexion de contrôle et d'authentification qui s'y passe à chaque connexion de données nécessite le client pour se connecter avec le même session TLS. Pour moi c'est logique que la façon dont il est censé être le travail, mais l'Apache Commons Net FTPS mise en œuvre ne semble pas être le faire. Il semble être en essayant d'établir une nouvelle session TLS, et donc, le serveur rejette la tentative.

Basé sur cette question sur la reprise des sessions SSL dans JSSE, il semble que Java suppose ou implique une session différente pour chaque hôte/post combinaison. Mon hypothèse est que, depuis le FTPS connexion de données est sur un autre port que le port de la connexion de contrôle, il n'est pas de trouver de la session existante et tente d'en établir un nouveau, de sorte que la connexion échoue.

Je vois trois possibilités principales:

  1. Le serveur n'est pas à la suite de la FTPS standard, en exigeant la même session TLS sur le port de données que sur le port de contrôle. Je peux me connecter au serveur fines (à l'aide de la même host/user/mot de passe que je suis en train de l'utiliser dans mon code) à l'aide de FileZilla 3.13.1. Le serveur s'identifie lui-même comme "FileZilla Server 0.9.53 bêta" lors de la connexion, alors c'est peut-être une sorte de propriété FileZilla façon de faire les choses, et il y a quelque chose de bizarre, j'ai besoin de faire pour convaincre Java à utiliser la même session TLS.
  2. Apache Commons Net client ne fait pas suivre le FTPS standard, et ne permet qu'un sous-ensemble qui ne permet pas de sécuriser les connexions de données. Cela semble étrange, comme cela semble être le standard de connexion FTP à partir de l'intérieur de Java.
  3. Je suis complètement à côté de quelque chose et erreurs de diagnostic.

Je te remercie de n'importe quelle direction vous pouvez fournir quant à la façon de se connecter à ce genre de serveur FTPS. Merci.

Veuillez consulter ce lien pour plus de détails stackoverflow.com/questions/46631315/...

OriginalL'auteur Peter Cooper Jr. | 2015-09-04