gpt4 book ai didi

java - 530 用户无法使用 FTPSClient 登录

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:17 64 4
gpt4 key购买 nike

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

530 User cannot log in.

除此之外别无其他。到目前为止,我们有以下代码(针对示例进行了简化):

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());
  • 不是设置 HOST,而是使用用户作为:username = "A_SERVER|A_USER";。同样的错误信息

服务器确实带有证书,出于调试目的我们很乐意忽略它。这就是为什么我们将 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.

最佳答案

我记得当我尝试将我的代码从 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--
}

关于java - 530 用户无法使用 FTPSClient 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41975257/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com