2011-07-28 33 views
3

私はFTPSサーバを作成していますが、AUTH TLSコマンドの後にssl接続に問題があります。 簡単な例: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); 
} 

説明:FTPクライアント(たとえばMoveITFreely)は、サーバが "成功した234 AUTH TLS" を送って、 "AUTH TLS" sendコマンドの後ポート21上のサーバーに接続します。クライアントはポート990(?)のサーバーに接続する必要がありますが、クライアントは接続せずにタイムアウト例外を取得します。

私は間違っていますか?

答えて

7

FTPにSSLを追加する方法は2つあります。

最初の方法は暗黙のSSLと呼ばれます。これは、サーバーがポート990でリッスンしていることを意味し、クライアントが接続すると、最初のSSL/TLSネゴシエーションが実行され、確立された接続が通信のコマンド・チャネルとして使用されます(データ・チャネルSSLハンドシェークは、同様の方法)。

2番目の方法は、使用しようとしているものです。明示的なSSLと呼ばれています。クライアントはポート21で接続し、AUTH TLSを送信し、既存の接続でSSLネゴシエーションを開始します。データチャネルは、あなたが望む方法(PROTコマンドを使用して指定します)に応じて、保護されているか、保護されていない可能性があります。

メソッドを混合しました。私はさらに進む前にdetailed explanation in Wikipediaを読むことをお勧めします。その後、RFC for explicit TLSと読んでください。

アップデート:SSLServerSocketではなく、SSLClientSocketが必要です。

+0

ありがとうございました!既存のSocketからSSL接続を作成する方法を教えてください。 – smie

+1

@ user857923 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

その助け!感謝Zenya! – smie

関連する問題