我们遇到的最初问题是,由于不受信任的服务器证书,常规FTP下载开始失败。这促使我们想知道证书是否在没有对方通知我们的情况下进行了更新,因此我们想要下载当前证书并将其与我们在密钥库中的证书进行比较。
这似乎比我们预期的更棘手。通常的嫌疑人(firefox,filezilla,...)似乎没有通过FTP代理连接到FTP服务器的任务,所以出于好奇我开始玩更低级别的Java方法。我不能为我的生活让它工作。
首先(过于简单化)java尝试:
// create proxy connection
SocketFactory plainFactory = SocketFactory.getDefault();
Socket proxy = plainFactory.createSocket(proxyServer, proxyPort);
// create ssl connection on top of it?
SSLSocketFactory sslFactory = getSocketFactory();
SSLSocket socket = (SSLSocket) sslFactory.createSocket(proxy, server, port, true);
这种方法显然不起作用。
接下来我开始玩ftp4j(http://www.sauronsoftware.it/projects/ftp4j/)它似乎有一个干净且易于访问的代码库:
FTPClient client = new FTPClient();
client.setConnector(new FTPProxyConnector(proxyHost, proxyPort));
client.getConnector().setConnectionTimeout(0);
client.getConnector().setReadTimeout(0);
client.setSSLSocketFactory(getSocketFactory());
// also tried SECURITY_FTPS
client.setSecurity(FTPClient.SECURITY_FTPES);
client.connect(server, port);
输出:
REPLY: 220 Blue Coat FTP Service
SEND: USER anonymous
REPLY: 530-User Access denied.
REPLY: 530-
REPLY: 530-Usage: USER username@hostname
REPLY: 331 PASS userpassword
Exception in thread "main" java.io.IOException: Invalid proxy response
代理服务器具有可选的身份验证,在我们的开发服务器上,我们通常使用“user @ host”而不进行代理身份验证。因此我假设用户名,主机名和密码是远程服务器的那些?
所以我尝试添加远程参数,这不起作用:
REPLY: 220 Blue Coat FTP Service
SEND: USER test@ftps.example.com
Exception in thread "main" java.io.IOException: FTPConnection closed
添加代理用户以匹配bluecoat格式似乎也不起作用:
USER %u@%h %s
PASS %p
ACCT %w
欢迎任何有关这两个问题的帮助: