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

有两种方法可以将 SSL 添加到 FTP。

第一种方法称为隐式 SSL。表示服务器监听990端口,当客户端连接时,首先进行SSL/TLS协商,然后将建立的连接作为命令通道进行通信(对于数据通道,SSL握手也是在一个类似的方式)。

第二种方法是您尝试使用的方法。它被称为显式 SSL。客户端在端口 21 上连接,发送 AUTH TLS 并在现有连接上启动 SSL 协商。数据通道可以根据您的需要进行保护或不保护(您使用 PROT 命令指定)。

你混合了这些方法。我建议您在进一步阅读之前阅读Wikipedia 中的详细说明。然后阅读RFC 以获取显式 TLS

更新:您还需要 SSLClientSocket,而不是 SSLServerSocket。

于 2011-07-28T07:04:00.290 回答