4

FTPS サーバーを書いていますが、AUTH TLS コマンドの後で ssl 接続に問題があります。簡単な例:

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 など) はポート 21 でサーバーに接続します。コマンド「AUTH TLS」を送信した後、サーバーは「234 AUTH TLS 成功」を送信します。クライアントはポート 990(?) でサーバーに接続する必要がありますが、クライアントは接続せず、タイムアウト例外を取得します。

私は何を間違っていますか?

4

1 に答える 1

7

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

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

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

あなたは方法を混ぜました。先に進む前に、ウィキペディアの詳細な説明を読むことをお勧めします。次に、明示的なTLSのRFCを読みます。

更新:SSLServerSocketではなくSSLClientSocketも必要です。

于 2011-07-28T07:04:00.290 に答える