2011-07-28 6 views
3

J'écris le serveur FTPS, et j'ai des problèmes avec la connexion ssl après la commande AUTH TLS. Exemple simple:Connexion au serveur FTPS

try 
{ 
    int ServerPort = 21; 
    ServerSocket FtpExServer = new ServerSocket(ServerPort); 
    while(true) 
    { 
     Socket S = FtpExServer.accept(); 
     InputStreamReader ISR = new InputStreamReader(S.getInputStream()); 
     OutputStreamWriter OSW = new OutputStreamWriter(S.getOutputStream()); 
     BufferedReader ClientSocketReader = new BufferedReader(ISR); 
     PrintWriter ClientSocketWriter = new PrintWriter(OSW, true); 

     ClientSocketWriter.println("220 Welcome to FTP server."); 
     print(ClientSocketReader.readLine()); 
     ClientSocketWriter.println("234 AUTH TLS successful"); 

     char[] passphrase = "pass".toCharArray(); 
     char[] cpassphrase = "cpass".toCharArray(); 
     KeyStore keystore = KeyStore.getInstance("JKS"); 
     keystore.load(new FileInputStream("keystore.jks"), passphrase); 
     KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
     kmf.init(keystore, cpassphrase); 
     SSLContext context = SSLContext.getInstance("TLS"); 
     KeyManager[] keyManagers = kmf.getKeyManagers(); 
     context.init(keyManagers, null, null); 
     SSLServerSocketFactory ssf = context.getServerSocketFactory(); 

     SSLServerSocket ss = (SSLServerSocket) ssf.createServerSocket(990); 
       ss.setSoTimeout(2000);   
       SSLSocket s = (SSLSocket)ss.accept(); 

     ISR = new InputStreamReader(s.getInputStream()); 
     OSW = new OutputStreamWriter(s.getOutputStream()); 
     ClientSocketReader = new BufferedReader(ISR); 
     ClientSocketWriter = new PrintWriter(OSW, true); 

     ClientSocketWriter.println("234 AUTH TLS successful"); 
     print(ClientSocketReader.readLine()); 
     ClientSocketWriter.println("331 Password required for smie"); 
     print(ClientSocketReader.readLine()); 
     ClientSocketWriter.println("230 User smie logged in"); 
     print(ClientSocketReader.readLine()); 
     ClientSocketWriter.println("215 UNIX Type: L8"); 
     print(ClientSocketReader.readLine()); 
     ClientSocketWriter.println("550 Command not suported."); 
    } 
} 
catch(Exception e) 
{ 
    print(e); 
} 

Description: client FTP (par exemple MoveITFreely) se connecter au serveur sur le port 21. Après la commande d'envoi "AUTH TLS", serveur envoyer "234 AUTH TLS avec succès". Maintenant, le client doit se connecter au serveur sur le port 990 (?), Mais le client ne se connecte pas et obtient l'exception de délai d'attente.

Qu'est-ce que je fais mal?

Répondre

7

Il existe deux méthodes pour ajouter SSL à FTP.

La première méthode est appelée SSL implicite. Cela signifie que le serveur écoute sur le port 990 et lorsque le client s'y connecte, une première négociation SSL/TLS est effectuée, puis la connexion établie est utilisée comme canal de commande pour la communication (pour la liaison SSL du canal de données est également manière similaire).

La deuxième méthode est ce que vous essayez d'utiliser. C'est ce qu'on appelle SSL explicite. Le client se connecte sur le port 21, envoie AUTH TLS et lance la négociation SSL sur la connexion existante. Le canal de données peut être sécurisé ou non sécurisé selon la manière dont vous le souhaitez (vous l'indiquez à l'aide de la commande PROT).

Vous avez mélangé les méthodes. Je suggère que vous lisiez detailed explanation in Wikipedia avant d'aller plus loin. Ensuite, lisez RFC for explicit TLS.

Mise à jour: Vous devez également utiliser SSLClientSocket, pas SSLServerSocket.

+0

Merci pour votre information! Dites-moi comment je peux créer une connexion SSL à partir de Socket existant? – smie

+1

@ user857923 Voir la méthode SSLSocketFactory.createSocket() (http://download.oracle.com/javase/1.4.2/docs/api/javax/net/ssl/SSLSocketFactory.html#createSocket(java.net.Socket,% 20java.lang.String,% 20int,% 20boolean) –

+0

Son aide! Merci Zenya! – smie