Первоначальная проблема, с которой мы столкнулись, заключалась в том, что обычная загрузка 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 [email protected]
Exception in thread "main" java.io.IOException: FTPConnection closed
Добавление прокси-пользователя в соответствии с форматом bluecoat также не работает:
USER %u@%h %s
PASS %p
ACCT %w
Любая помощь с любой из этих двух проблем будет приветствоваться:
- как получить сертификат сервера с ftps-сервера через ftp-прокси
- как подключиться к ftps-серверу через ftp-прокси в java