Я использую такой обходной путь (см. фрагмент ниже) в 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 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");
}
}
}
}
Редактировать:
Вот снимок экрана журналов сервера полного сеанса:

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