530用户无法使用FTPSClient

时间:2017-02-01 08:40:49

标签: java ssl ftp

我们尝试使用与标准FTP客户端相同的凭据访问我们的某个FTPS服务器。但是,在使用Java类FTPSClient时,我们收到错误消息:

  

530用户无法登录。

没有别的。到目前为止,我们有以下代码(示例简化):

public final class FTPSExample {

    public static final void main(String[] args) {
        boolean error = false;
        String server, username, password;
        String protocol = "TLS";    // SSL/TLS
        FTPSClient ftps;


        server = "A_SERVER";
        username = /*server + "|" + */"A_USER";
        password = "A_PASS";

        ftps = new FTPSClient(protocol);
        ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());

        ftps.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));

        try {
            int reply;

            ftps.connect(server, 21);
            System.out.println("Connected to " + server + ".");

            reply = ftps.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                ftps.disconnect();
                System.err.println("FTP server refused connection.");
            } else {
                ftps.sendCommand("HOST", server);

                if (!ftps.login(username, password)) {
                    String[] welcomeMessage = ftps.getReplyStrings();
                    for(String s : welcomeMessage) {
                        System.out.println(s);
                    }
                    ftps.logout();
                    error = true;
                }
            }
        }
        catch (IOException e) {
            if (ftps.isConnected()) {
                try {
                    ftps.disconnect();
                }
                catch (IOException f) {
                    // do nothing
                }
            }
            System.err.println("Could not connect to server.");
            e.printStackTrace();
            System.exit(1);
        }
        System.exit(error ? 1 : 0);
    }
}

上面的代码为我们提供了以下日志消息:

220 Microsoft FTP Service
AUTH TLS
234 AUTH command ok. Expecting TLS Negotiation.
Connected to A_SERVER.
HOST A_SERVER
220 Host accepted.
USER A_USER
331 Password required for A_USER.
PASS A_PASS
530 User cannot log in.
530 User cannot log in.
QUIT
221 Goodbye.

同时如果我们在FTP客户端(例如FTP Voyager)中也这样做,我们得到:

STATUS:>    Connecting to "A_SERVER" on port 21.
    220 Microsoft FTP Service
COMMAND:>   AUTH TLS
    234 AUTH command ok. Expecting TLS Negotiation.
STATUS:>    Negotiating SSL connection with server.
STATUS:>    SSL connection established.  All transactions are now secure.
STATUS:>    Connected.  Logging into the server
COMMAND:>   HOST A_SERVER
    220 Host accepted.
COMMAND:>   USER A_USER
    331 Password required for A_USER.
COMMAND:>   PASS *********************
    230 User logged in.
STATUS:>    Login successful

我们尝试过的一些问题:

  • protocol从TLS更改为SSL,都会遇到同样的问题
  • 添加命令ftps.sendCommand("HOST", server);。我们看到FTP客户端在登录之前运行此命令,没有该行我们反而得到错误:530 Valid hostname is expected.
  • 使用FTPClient,这会产生预期的534 Policy requires SSL.
  • 删除导致相同错误的ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
  • 使用用户:username = "A_SERVER|A_USER";,而不是设置HOST。相同的错误消息

服务器附带证书,出于调试目的,我们很乐意忽略。这就是我们将TrustManager设置为接受所有内容的原因。我们应该注意另一种设置吗?

我们没有代理集,我们没有收到有用的错误消息。谷歌搜索530 User cannot log in.到目前为止没有提供任何有用的东西。有没有人有任何建议?

修改

我设法使用名为FTP4J的其他软件包来运行它,但是如果有人能够阐明FTPSClient无效的原因,那就太棒了。这是工作代码:

public final class FTPSExample {

    public static final void main(String[] args) {
        boolean error = false;
        String server, username, password;
        FTPClient ftps;

        server = "A_SERVER";
        username = server + "|" + "A_USER";
        password = "A_PASS";

        ftps = new FTPClient();
        ftps.setSecurity(FTPClient.SECURITY_FTPES);
        ftps.addCommunicationListener(new FTPCommunicationListener() {

            @Override
            public void sent(String s) {
                System.out.println(s);
            }

            @Override
            public void received(String s) {
                System.out.println(s);
            }
        });

        try {

            ftps.connect(server);
            System.out.println("Connected to " + server + ".");

            if (!ftps.isConnected()) {
                ftps.disconnect(false);
                System.err.println("FTP server refused connection.");
            } else {
                //ftps.sendSiteCommand("HOST " + server);

                ftps.login(username, password);

                if (!ftps.isAuthenticated()) {
                    error = true;
                } else {
                    System.out.println("Connected!");
                }
                ftps.logout();
            }
        }
        catch (Exception e) {
            if (ftps.isConnected()) {
                try {
                    ftps.disconnect(false);
                }
                catch (Exception f) {
                    // do nothing
                }
            }
            System.err.println("Could not connect to server.");
            e.printStackTrace();
            System.exit(1);
        }
        System.exit(error ? 1 : 0);
    }
}

结果数据:

220 Microsoft FTP Service
Connected to A_SERVER.
AUTH TLS
234 AUTH command ok. Expecting TLS Negotiation.
USER A_SERVER|A_USER
331 Password required for A_SERVER|A_USER.
PASS A_PASS
230 User logged in.

1 个答案:

答案 0 :(得分:4)

我记得当我尝试将我的代码从FTP更改为FTPS时,我遇到了同样的错误,我使用此代码解决了它:

public void FTPSUploader(String host, String user, String pwd,int numPort) throws Exception {
    FTPSClient ftp = new FTPSClient();
    ftps.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
    int reply;
    ftps.connect(host, numPort);
    reply = ftp.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply)) {
        ftps.disconnect();
        throw new Exception("Exception in connecting to FTPs Server");
    }
    ftps.login(user, pwd);
    ftps.setFileType(FTP.BINARY_FILE_TYPE);
    ftps.enterLocalPassiveMode();
    ftps.execPBSZ(0);// Set protection buffer size
    ftps.execPROT("P");// Set data channel protection to private--
}