Как мое приложение может получить доступ к файлу keyStore.jks, настроенному в Tomcat server.xml?

В conf/server.xml я написал следующий текст:

<Connector port="8443" SSLEnabled="true" maxHttpHeaderSize="8192" 
    maxThreads="150" minSpareThreads="25" maxSpareThreads="200"
    enableLookups="false" disableUploadTimeout="true"         
    acceptCount="100" scheme="https" secure="true"
     clientAuth="false" sslProtocol="TLS"
     keystoreFile="keyStore" keystorePass="password" keystoreType="JKS"
     keyAlias="tomcat"/>

И затем мне нужно использовать содержимое keyStore в коде (в сервлете на стороне сервера).

Я попробовал это:

 System.getProperty("javax.net.ssl.keyStore")

Но он возвращает имя keyStore.

Так есть ли способ получить содержимое keyStore? Или, может быть, я должен сделать другую конфигурацию сервера?

(Мой следующий шаг - извлечение закрытых и открытых ключей из хранилища ключей и их использование для JWT).

1 ответ

Решение

Я думаю, что вы должны быть в состоянии получить значения параметров через ServerFactory.getServer().findServices()[0].findConnectors()[0] или же org.apache.tomee.loader.TomcatHelper.getServer() (в зависимости от вашей версии Tomcat - см. этот вопрос), а затем используйте их, чтобы открыть хранилище ключей как обычно (KeyStore.getInstance(...).load(...)).

Но я бы порекомендовал вам использовать другое хранилище ключей + ключ в специальной конфигурации для ваших нужд JWT, чтобы:

  • ваш код не тесно связан с Tomcat (= переносимость)
  • ваши сотрудники не должны заботиться о конкретных потребностях ваших приложений (и / или не захотят обновлять свое стандартное хранилище ключей SSL, используемое на всех их серверах Tomcat)
  • Вы не используете одни и те же ключи для шифрования (SSL) и авторизации (JWT). Делать жизнь нападающего немного сложнее - это всегда хорошо.

Если у вас нет файла конфигурации в вашем приложении, и вы не хотите добавлять его, вы можете просто ожидать, что системное свойство будет определено с путем к хранилищу ключей. Например начать Tomcat с -Djwt.keystore=<keystore location> в командной строке.

Другие вопросы по тегам