ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 连接到FTPS服务器

2019-06-14 01:53:24  阅读:283  来源: 互联网

标签:java ssl ftps jks


我写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(?)上的服务器,但客户端不连接并获得超时异常.

我做错了什么?

解决方法:

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

第一种方法称为隐式SSL.这意味着服务器正在侦听端口990,当客户端连接到它时,首先执行SSL / TLS协商,然后将建立的连接用作通信的命令通道(对于数据通道,SSL握手也在类似的方式).

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

你混合了方法.我建议你在走得更远之前阅读detailed explanation in Wikipedia.然后阅读RFC for explicit TLS.

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

标签:java,ssl,ftps,jks
来源: https://codeday.me/bug/20190614/1236368.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有