Подключиться к серверу FTPS - PullRequest
4 голосов
/ 28 июля 2011

Я пишу FTPS-сервер, и у меня проблемы с ssl-соединением после команды AUTH TLS. Простой пример:

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 (?), Но клиент не подключается и получает исключение тайм-аута.

Что я делаю не так?

1 Ответ

7 голосов
/ 28 июля 2011

Существует два способа добавления SSL на FTP.

Первый метод называется неявным SSL.Это означает, что сервер прослушивает порт 990, и когда клиент подключается к нему, сначала выполняется согласование SSL / TLS, а затем установленное соединение используется как командный канал для связи (для канала данных SSL рукопожатие также выполняется ваналогичным образом).

Второй метод - это то, что вы пытаетесь использовать.Это называется явным SSL.Клиент подключается к порту 21, отправляет AUTH TLS и запускает согласование SSL для существующего подключения.Канал данных может быть защищен или не защищен в зависимости от того, как вы этого хотите (вы указываете это с помощью команды PROT).

Вы смешали методы.Я предлагаю вам прочитать подробное объяснение в Википедии , прежде чем идти дальше.Затем прочитайте RFC для явного TLS .

Обновление: вам также понадобится SSLClientSocket, а не SSLServerSocket.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...