2012-03-19 3 views
3

У меня есть веб-приложение, работающее в Tomcat, которое вызывает вызов веб-службы в другой системе. Мне нужно защитить этот вызов с помощью SSL и проверки подлинности клиента. Tomcat, в котором я размещен, уже правильно настроен с доверительным магазином и хранилищем ключей, специфичным для среды, поэтому мне нужно использовать эти магазины для обеспечения моего собственного вызова. Здесь я застрял.Доступ к настроенному Tomcat KeyStore и TrustStore

Как я могу найти хранилище ключей и доверительное хранилище, с которыми настроен Tomcat, чтобы сделать свой собственный звонок SSL? Или лучше, сгенерировать правильно настроенный SSLContext или SSLSocketFactory с этими значениями?

Что я пробовал:

  1. Я попытался, опираясь на SSLContext.getDefault(). Это, похоже, не установлено.

  2. Я попытался, опираясь на системные свойства:

    System.getProperty("javax.net.ssl.trustStore"); 
    System.getProperty("javax.net.ssl.trustStorePassword"); 
    System.getProperty("javax.net.ssl.trustStoreType"); 
    System.getProperty("javax.net.ssl.keyStore"); 
    System.getProperty("javax.net.ssl.keyStorePassword"); 
    System.getProperty("javax.net.ssl.keyStoreType"); 
    

Но это, как представляется хрупким решение, как Tomcat не должны быть настроены с системными свойствами. В одной из тестовых сред задана информация хранилища доверия, но переменные хранилища ключей нет. Они определены в файле server.xml Tomcat.

Есть ли какой-нибудь простой способ сделать это, что я не замечаю?

Обновлено:

This question is similar и один из ответов указывает на то, что SSL может обрабатываться OpenSSL \ АПР, поэтому любое решение здесь будет в значительной степени зависеть от способа Tomcat сконфигурирован. Предполагая JSSE, решения выглядят так:

  • Обеспечить, чтобы Tomcat был настроен с помощью свойств системы.
  • Имейте магазины, находящиеся в предопределенном месте на сервере.
  • Пакет собственных копий магазинов в вашей войне.

Для первых двух вы должны убедиться, что политика безопасности позволяет получить доступ к этим файлам.

Действительно ли это лучшие практики для того, что я пытаюсь сделать?

+0

Возможный дубликат [Доступ к секретному ключу SSL с сервлета] (http://stackoverflow.com/questions/4048892/accessing-ssl-private-key-from-a-servlet) – Bruno

+0

Обратите внимание, что в целом не возможность доступа к настройкам SSL в контейнере (в частности, к его закрытому ключу) является функцией безопасности, поскольку веб-сервер может не полностью доверять. Вы также можете быть заинтересованы в следующем: http://stackoverflow.com/q/5162279/372643 – Bruno

+0

Я подозревал, что это может быть функция безопасности, но это странно, поскольку эти магазины на самом деле довольно легко доступны в зависимости от того, как настроен Tomcat. Я надеялся, что есть способ отметить сервлет как доверенный или что-то еще. – Don

ответ

0

Я думаю, среди прочего, вы вводите в заблуждение входящие и исходящие SSL-соединения. Server.xml содержит входящие настройки SSL.

При использовании исходящего SSL в Java, javax.net.ssl.trustStore * и javax.net.ssl.keyStore * должны быть явно заданы при запуске Tomcat. Помните, что по умолчанию хранилище ключей может содержать только один закрытый ключ, если вы не закодируете собственный манипулятор.

Наиболее известные библиотеки webservice используют стандартные библиотеки HTTP, которые используют HTTPConnection/HTTPSConnection или Jakatta HTTPClient и представляют сертификат клиента из хранилища ключей по запросу сервера. Вам не нужно создавать собственный SSLContext.

Если вы завершаете входящие вызовы Webservice, тогда я бы использовал HTTP-сервер Apache с SSL и аутентификацией клиента, если это необходимо.

+0

Если я правильно помню, вы можете иметь несколько закрытых ключей в KeyStore, если вы укажете псевдонимы. – Pith