Как установить FTPS-соединение для передачи данных с сервером FileZilla 1.2.0JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как установить FTPS-соединение для передачи данных с сервером FileZilla 1.2.0

Сообщение Anonymous »

Известная проблема при использовании Java FTPSClient общедоступной сети Apache с возобновлением сеанса. Возобновление сеанса — это функция безопасности, которая может потребоваться серверу FTPS для подключений к данным. Apache FTPSClient не поддерживает возобновление сеанса, а API-интерфейсы JDK затрудняют создание собственной реализации. Есть несколько обходных путей с использованием отражения, см., например. этот ответ и эта запись об ошибке в общей сети.
Я использую такой обходной путь (см. фрагмент ниже) в JDK 11 и тестировал его на локальном сервере FileZilla. Он работает с FileZilla Server 0.9.6, но не работает с FileZilla Server 1.2.0, который является последней версией на момент написания. В этой версии при попытке установить соединение для передачи данных сервер отвечает:

Код: Выделить всё

425 Unable to build data connection: TLS session of data connection not resumed.
Как я уже сказал, FileZilla Server 0.9.6 хорошо справляется с возобновлением сеанса, и я убедился, что параметр, требующий возобновления сеанса, активирован.
В FileZilla Server 1.2.0 такие параметры теперь задаются неявно и не могут быть изменены через графический интерфейс, а может быть, и вообще не могут быть изменены. Есть ли какие-то настройки сервера, которые я могу настроить, чтобы это работало? Или это проблема с тем, как я реализовал обходной путь? Есть ли у кого-нибудь подобные проблемы?
Я использую этот обходной путь:

Код: Выделить всё

public class FTPSClientWithSessionResumption extends FTPSClient {

static {
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
System.setProperty("jdk.tls.client.enableSessionTicketExtension", "false");
}

@Override
protected void _connectAction_() throws IOException {
super._connectAction_();
execPBSZ(0);
execPROT("P");
}

@Override
protected void _prepareDataSocket_(Socket socket) throws IOException {
if (useSessionResumption && socket instanceof SSLSocket) {
// Control socket is SSL
final SSLSession session = ((SSLSocket)_socket_).getSession();
if (session.isValid()) {
final SSLSessionContext context = session.getSessionContext();
try {
final Field sessionHostPortCache = context.getClass().getDeclaredField("sessionHostPortCache");
sessionHostPortCache.setAccessible(true);
final Object cache = sessionHostPortCache.get(context);
final Method putMethod = cache.getClass().getDeclaredMethod("put", Object.class, Object.class);
putMethod.setAccessible(true);
Method getHostMethod;
try {
getHostMethod = socket.getClass().getMethod("getPeerHost");
}
catch (NoSuchMethodException e) {
// Running in IKVM
getHostMethod = socket.getClass().getDeclaredMethod("getHost");
}
getHostMethod.setAccessible(true);
Object peerHost = getHostMethod.invoke(socket);
InetAddress iAddr = socket.getInetAddress();
int port = socket.getPort();
putMethod.invoke(cache, String.format("%s:%s", peerHost, port).toLowerCase(Locale.ROOT), session);
putMethod.invoke(cache, String.format("%s:%s", iAddr.getHostName(), port).toLowerCase(Locale.ROOT), session);
putMethod.invoke(cache, String.format("%s:%s", iAddr.getHostAddress(), port).toLowerCase(Locale.ROOT), session);
}
catch (Exception e) {
throw new IOException(e);
}
}
else {
throw new IOException("Invalid SSL Session");
}
}
}
}
Адрес, под которым кэшируется сокет, определяется с помощью getPeerHost, getInetAddress().getHostName() и getInetAddress().getHostAddress(). Я пробовал несколько комбинаций выполнения или невыполнения этих трех, но всегда получаю один и тот же результат.
Редактировать:
Вот снимок экрана журналов сервера полного сеанса:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/709 ... rver-1-2-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»