我们尝试使用与标准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.
答案 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--
}