Не удается получить корневой сертификат X509 от клиента в Tomcat - PullRequest
4 голосов
/ 23 марта 2012

Я пытаюсь настроить тестовую среду для нашего приложения, которое использует аутентификацию клиента X.509 через HTTPS в Tomcat 6.0.Код сервлета ожидает получить цепочку сертификатов в виде массива X509Certificate объектов, используя javax.servlet.request.X509Certificate запроса сервлета.Однако этот массив содержит только один элемент (сертификат клиента), где я ожидаю, что его будет два (сертификат клиента и сертификат корневого центра сертификации, который его подписал).

Вот что я сделалдо сих пор:

  1. Создание самозаверяющего сертификата CA с использованием openssl.
  2. Импорт сертификата CA в качестве доверенного корневого сертификата во вновь созданное хранилище ключей Java.
  3. Сконфигурируйте соединитель Tomcat HTTPS так, чтобы он требовал аутентификации клиента, используя хранилище ключей, созданное на шаге 2, в качестве хранилища доверенных сертификатов:
    • clientAuth="true"
    • truststoreFile="<path_to_truststore>"
  4. Создайте новый сертификат клиента с помощью openssl и подпишите его сертификатом CA.
  5. Запустите Tomcat.
  6. Установите сертификат клиента в Chrome и перейдите на домашнюю страницу моего сервера.Проходя по коду в отладке, я вижу, что массив, возвращенный как атрибут javax.servlet.request.X509Certificate, имеет только сертификат клиента.

Я знаю, что Tomcat выбирает сертификат корневого CA из хранилища доверенных сертификатов, потому чтокогда я удаляю его из хранилища доверенных сертификатов, я получаю ошибку соединения SSL.Он просто не попадает в запрос сервлета, как указано в документации.Я пропускаю какие-либо дополнительные настройки здесь?Возможно, Tomcat (или Java или JSSE) ожидает каких-то дополнительных расширений X509 V3 или чего-то еще?

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ

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

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

То, что вы видите, это то, что ожидается: Chrome не отправляет CA.

Во время рукопожатия TSL при аутентификации клиента сервер отправит список приемлемых CA какчасть своего сообщения CertificateRequest ( RFC ), затем браузер представит сертификат, подписанный одним из этих центров сертификации.

ADD

btw,отличный способ отладки клиентской части SSL-соединения - использовать фантастические инструменты openssl

openssl s_client -connect ssl.server.com:443

или только для серверов SSLV3

openssl s_client -connect ssl.server.com:443 -ssl3

Это выведет (среди прочего) список допустимых CA.

Для отладки на стороне сервера добавьте это в командную строку JVM -Djavax.net.debug=ssl

0 голосов
/ 23 марта 2012

Хранилище ключей идентификации должно содержать сертификат, подписанный ЦС;не самоподписанный сертификат.Корень CA должен находиться в хранилище доверенных сертификатов.

Кроме того, какова цель шага 4?

...