Как приложение Java может беспрепятственно принимать сертификат сервера?

Большинство веб-браузеров, поддерживающих SSL, имеют список центров сертификации, сертификаты которых они будут автоматически принимать. Если браузер встречает сертификат, авторизующий ЦС которого находится в списке, браузер автоматически примет сертификат и установит SSL-соединение с сайтом.

Существует клиент Java 1.6, работающий на JBoss 7, который требуется для установления SSL-соединения с сервером LDAP. Поскольку клиент находится в рабочей среде, если сервер LDAP обновит свой сертификат, не уведомив меня о необходимости соответствующего обновления сертификата на JBoss, клиент выйдет из строя. Мой вопрос: как я могу безопасно подключиться (ssl) к LDAP таким же образом, как браузер «беспрепятственно принимает» сертификат?

Я не знаю, возможно ли это в Java. Но любые мысли и отзывы приветствуются.


person Will L    schedule 19.09.2012    source источник


Ответы (1)


Java имеет хранилище доверенных сертификатов по умолчанию, которое содержит все доверенные сертификаты. Он находится под %JRE_HOME%\lib\security\cacert и имеет все доверенные сертификаты ЦС (Verisign и т. д.).
Поэтому, если ваше клиентское https приложение попытается подключиться к серверу, который развертывает сертификат, подписанный этими издателями, у вас не будет проблем (так же, как это происходит с вашим браузер).
Теперь о вашей проблеме. Вы не указали достаточно информации о своем LDAP сервере.
Я могу предположить следующее:

  1. Сервер LDAP развертывает сертификат, подписанный каким-либо CA (не одним из известных).
  2. Сервер LDAP развертывает самозаверяющий сертификат

Для случая (1) все, что вам нужно сделать, это добавить сертификат подписанта в ваше хранилище доверенных сертификатов (т. е. сертификат поставщика, подписавшего сертификат вашего сервера LDAP). Если сервер LDAP изменит сертификат, вы не пострадаете при условии, что он получит сертификат от того же ЦС, который вы сейчас установили как доверенный. Этот доверенный сертификат можно добавить в cacerts, но рекомендуемое решение — использовать собственное отдельное хранилище доверенных сертификатов, импортировать его и установить в JVM, чтобы переопределить значение по умолчанию cacerts. Много примеров в гугле.

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

Но в любом случае я могу только предположить, что сертификат меняется в связи с истечением срока действия? Я не могу придумать другой причины (кроме компрометации закрытого ключа, но это не проблема из вашего описания)

person Cratylus    schedule 19.09.2012
comment
Сертификат LDAP подписан известным центром сертификации. Сертификат меняется, потому что срок его действия истек. Я думаю, что решение было бы предложено для случая 1, верно? ... добавьте сертификат подписывающей стороны в хранилище доверенных сертификатов... Он также известен как корневой сертификат? - person Will L; 20.09.2012
comment
@WillL: Вы можете увидеть, включен ли этот хорошо известный ЦС как часть хранилища доверенных сертификатов Java по умолчанию. Если это так, то все в порядке. Если это не так, я предлагаю вам не импортировать его, а настроить хранилище доверенных сертификатов с этим сертификат ЦС - person Cratylus; 20.09.2012
comment
Cratylus, на самом деле это новый сертификат. В java я могу установить безопасное соединение с LDAP, и клиент Java примет и сохранит сертификат без того, чтобы кто-то вручную обновлял сертификат на клиенте? Это слишком амбициозно? -спасибо - person Will L; 21.09.2012
comment
Это возможно, если вы сами пишете код, но это совершенно неправильно с точки зрения безопасности. Идея состоит в том, что доверенный сертификат сервера предварительно установлен и вы проверяете сертификат, который сервер отправит вам в SSL-рукопожатии с тем, который вы уже считаете доверенным. Если вы динамически принимаете сертификат сервера как доверенный, тогда SSL становится бесполезным - person Cratylus; 21.09.2012
comment
Я не должен говорить, что клиент «просто» принимает сертификат. Как только клиент получает сертификат, он все равно должен проверить, подписан ли сертификат доверенным ЦС. Я согласен с вашей точкой зрения. В противном случае это просто противоречит цели рукопожатия SSL. Что вы подразумеваете под «предустановленным доверенным сертификатом сервера»? - person Will L; 21.09.2012
comment
@WillL: если сертификат ЦС, выдавший сертификат, уже является частью вашего хранилища доверенных сертификатов, все в порядке. - person Cratylus; 21.09.2012