Я пытаюсь настроить простое приложение Spring для использования SSL и разместить его в Digital Ocean. Почему мое приложение не находит файл хранилища ключей?
Капля, которую я установил, основана на Ubuntu 18.04. Я использовал Letsencrypt для получения сертификата и руководства это для создания файла PKCS. Я настроил свой файл application.properties для поиска в текущем каталоге файла jar следующим образом:
security.require-ssl:true
server.ssl.key-store:keystore.p12
server.ssl.key-store-password:<password>
server.ssl.key-store-type:PKCS12
server.ssl.key-alias:<alias>
Я ожидаю, что это запустится и запустит веб-сервер на настроенном порту. Однако в трассировке стека я получаю следующее:
Caused by: java.io.FileNotFoundException: /root/software/gimmememe/target/keystore.p12 (No such file or directory)
Как ни странно, когда я запускаю ту же банку с тем же файлом keystore.p12 на своем собственном компьютере с Windows, он работает нормально:
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9123 (https) with context path ''
meme.Application : Started Application in 4.985 seconds (JVM running for 5.464)
Я не думаю, что это проблема с разрешениями на компьютере с Ubuntu, поскольку я пытался установить разрешения для файла хранилища ключей следующим образом:
-rw-r--r-- 1 root root 4274 Mar 26 18:44 keystore.p12
Я запускаю свой jar-файл с помощью следующей команды (также пытался использовать sudo infront):
java -jar gimme-meme-1.0.0.war
Я использую только встроенный кот в Spring. Я не уверен, что именно так это работает, но я просто запускаю банку из командной строки. Также я не буду работать как root, когда все это будет настроено.
Не существует такой вещи, как «текущий каталог JAR-файла». Существует текущий рабочий каталог и каталог, в котором находится файл JAR, и это не обязательно одно и то же, особенно в контейнере WEB.
Извините за путаницу тогда. Я имею в виду каталог, в котором находится JAR, и туда же я помещаю файл keystore.p12.
Итак, вы должны назвать его полностью, потому что контейнер смотрит не на это. Вы указали только имя файла, поэтому он ищет в текущем рабочем каталоге это, и вы можете увидеть, что это такое, из сообщения об ошибке. Так что ошибся, поставь там.
Это действительно так. Вот что так сбивает с толку во всем этом.
Как было предложено @isapir, в имени файла был завершающий пробел. Не совсем уверен, как он туда попал и почему Spring не очищает его автоматически. По какой-то причине это не было проблемой при работе в Windows... Во всяком случае, это решило проблему.




Похоже, ваше приложение просто ищет в текущем каталоге файл keystore.p12, на что указывает:
Caused by: java.io.FileNotFoundException: /root/software/gimmememe/target/keystore.p12 (No such file or directory)
Скорее всего, вам нужно сообщить Spring Boot, что файл в является банкой.
Например, если вы сохраните файл в src/main/resources, gradle и maven поместят этот файл в корень пути к классам. Чтобы передать эту информацию приложению весенней загрузки, вам нужно сообщить ему, что файл находится в пути к классам.
Это означает, что вам нужно установить server.ssl.key-store на classpath:keystore.p12, чтобы Spring знал, что ему нужно загрузить хранилище ключей из пути к классам архива.
-- РЕДАКТИРОВАТЬ --
Вот пример похожей проблемы, который иллюстрирует это исправление.
Выпуск Github с похожей проблемой
«В текущем каталоге файла JAR» не означает «в файле JAR».
Спасибо за предложение. Я попытался поместить файл keystore.p12 в src/main/resources, и он действительно включен в выходную банку. Я также добавил classpath: перед именем файла и получил следующую ошибку: FileNotFoundException: class path resource [keystore.p12 ] cannot be resolved to URL because it does not exist Я считаю, что это проблема среды, учитывая, что на моем компьютере с Windows все работает нормально.
@MZokov, если вы попытаетесь запустить ту же команду java -jar на своем компьютере с Windows с файлом в банке, это сработает? Если мы сможем заставить это работать, тогда оно должно быть перенесено туда, где вы развертываете приложение. Другой вариант — просто скопировать файл .p12 туда, где вы развертываете приложение, и поместить его рядом с работающим банком. Я лично предпочитаю комплектовать его так, чтобы банка была портативной и могла работать где угодно.
Кроме того, если вы запускаете проект как war, src/main/resources на самом деле может не оказаться в корне пути к классам — вам может понадобиться поместить его в src/main/resources/WEB-INF, я не уверен, нужно ли его вкладывать дальше, но войны обрабатываются иначе, чем чистые весенние загрузочные банки.
На самом деле я получаю ту же ошибку на своем компьютере с Windows. FileNotFoundException: class path resource [keystore.p12 ] cannot be resolved to URL because it does not exist . Попробую и обычную банку вместо войны. Я не уверен, что мне нужно, чтобы это обязательно была война.
Сборка в виде jar и работа с server.ssl.key-store=classpath:keystore.p12 дает мне следующий (немного отличающийся) результат: .WebServerException: Could not load key store: class path resource [keystore.p12 ] cannot be resolved to URL because it does not exist как на машинах с Windows, так и на Ubuntu.
Просто чтобы уточнить, когда вы изменили его обратно на банку, вы все еще помещаете хранилище ключей в src/main/resources? Кроме того, вам может потребоваться убедиться, что вы используете плагин весенней загрузки для создания uber jar, чтобы вы могли найти этот файл .p12 в банке, в папке BOOT-INF, я полагаю?
Spring загружает файл из пути к классам, что позволяет, поэтому вы должны добавить к пути префикс classpath:, например.
server.ssl.key-store : classpath:keystore.p12
Или, если вы используете символ = в качестве разделителя ключ/значение:
server.ssl.key-store = classpath:keystore.p12
Имейте в виду, что значение обрезается только с левой стороны, поэтому после значения не может быть пробелов в конце.
Похоже, что на машине с Ubuntu Spring не очищал конечные пробелы.
У меня были точно такие же проблемы, и я смог их решить.
Я сохранил файл хранилища ключей в src/основной/ресурсы/keystore.p12, но в файле jar он находился непосредственно в классы/.
Мое решение было:
server.ssl.key-store=classpath:keystore.p12
Ваш кот работает как root? В целевом каталоге.