Я создаю приложение, которое генерирует файл CSV и некоторые PDF-файлы.Я хочу, чтобы мое приложение отправляло эти файлы на сервер по протоколу FTPS.
Я использую библиотеку Apache Commons Net FTP, и она прекрасно работала, когда у меня было «Требовать возобновления сеанса TLS при подключении к данным при использовании PORT P»"снят, но поскольку я включил его, я не могу отправлять свои файлы.Появилась ошибка: 450 TLS session of data connection has not resumed or the session does not match the control connection
.
После некоторых исследований на этом сайте я переопределил _prepareDataSocket_
, чтобы преодолеть эту проблему, но теперь он просто создает пустые файлы на сервере.
Таммоя переопределенная функция:
@Override
protected void _prepareDataSocket_(final Socket socket) throws IOException {
if (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 method = cache.getClass().getDeclaredMethod("put", Object.class, Object.class);
method.setAccessible(true);
method.invoke(cache, String
.format("%s:%s", socket.getInetAddress().getHostName(), String.valueOf(socket.getPort()))
.toLowerCase(Locale.ROOT), session);
method.invoke(cache, String
.format("%s:%s", socket.getInetAddress().getHostAddress(), String.valueOf(socket.getPort()))
.toLowerCase(Locale.ROOT), session);
} catch (NoSuchFieldException e) {
throw new IOException(e);
} catch (Exception e) {
throw new IOException(e);
}
} else {
throw new IOException("Invalid SSL Session");
}
}
}
и вот что FileZilla Server отображает: FileZilla Response