#java #spring-boot #apache-camel #ftps #camel-ftp
#java #весенняя загрузка #apache-camel #ftps #camel-ftp
Вопрос:
Я пытаюсь подключить свое приложение Spring Boot к серверу FTPs через camel-ftp. И я настроил файл хранилища ключей по ftpClient.trustStore.file
параметру в Uri подключения FTPs. Это работает как обычно при запуске отладки в IDE, но при упаковке приложения в файл war и развертывании в контейнере Docker. Я получил исключение FileNotFoundException : Caused by: java.io.FileNotFoundException: file:/usr/app/app.war!/WEB-INF/classes!/keys/diode.jks (No such file or directory)
Я пытался проверить
- Дополнительный файл war и хранилище ключей уже существовали в папке /classes/keys (его можно скопировать из папки /resources/keys в исходном коде)
- Добавьте журнал, и я смогу получить содержимое файла хранилища ключей при запуске приложения с war, но не могу получить путь к файлу для передачи в Uri соединения FTPs.
Как я могу получить реальный путь к файлу хранилища ключей в war и перейти в FTPClient.trustStore.параметр файла в Uri соединения FTPs с camel-ftp
Ответ №1:
Из сообщения об исключении я бы сделал вывод, что что-то пытается открыть URL-адрес «file:», как если бы это был обычный путь к файлу. Это не сработает.
- Если у вас есть что-то, для чего требуется путь к файлу, вам нужно указать ему реальный путь к файлу. Не
file:
URL-адрес. - Если URL-адрес ссылается на ресурс внутри файла JAR или WAR, для него нет допустимого пути к файловой системе. Материал внутри архивного файла не может быть открыт таким образом. Системные вызовы «открыть файл» вашей операционной системы требуют указания пути, а не URL.
Итак, что вам, вероятно, нужно будет сделать, это извлечь файл хранилища ключей из WAR и записать его в файл в файловой системе. (Похоже, это уже сделано.) Затем вам нужно изменить URL-адрес подключения FTPS, чтобы использовать путь к этому файлу file.
Комментарии:
1. Да, если я сохраняю хранилище ключей в файловой системе сервера и использую абсолютный путь. Это работает, как и ожидалось. Но я хочу сохранить хранилище ключей внутри файла war для динамического развертывания, чтобы помочь его развернуть на любом сервере без копирования файла хранилища ключей на новый сервер
2. Возможно, вы захотите, но вы не можете. Если хранилище ключей находится ТОЛЬКО внутри файла WAR, то вашему приложению необходимо извлечь (путем чтения в качестве ресурса), а затем записать этот файл в файловую систему. Затем он использует путь к файлу в файловой системе. (Это имеет очень мало значения с точки зрения безопасности. Если хакер может читать файлы в файловой системе, он также может прочитать файл WAR и извлечь хранилище ключей для себя.)
3. (Я говорю, что вы не можете… но я имею в виду, что вы не можете без изменения Camel-ftp работать по-другому.)
4. да, я знаю. Я пытался использовать тот же способ, что и ваше предложение. Используйте код для чтения хранилища ключей как ресурса и записи в файловую систему при первом запуске приложения. Это нормально для развертывания в любом месте без ручного копирования хранилища ключей на каждый сервер. Я задал этот вопрос, чтобы узнать, есть ли какой-либо другой способ помочь решить эту проблему :), Спасибо Стивен!