Я использую веб-приложение Apache Tomcat в качестве клиента (java) для веб-службы, размещенной на IIS. Мне нужно использовать SSL с аутентификацией клиента. Какие критерии соответствия используются клиентом для отправки сертификата клиента на сервер как часть CertificateRequest, который является частью ServerHello.
Я установил сертификат клиента в IE и получил доступ к WSDL, затем он запрашивает сертификат клиента, и я выбираю тот, который я установил, и он работает.
При необходимости могу отправить отладочный ssl-дамп.
В конечном итоге сертификат будет отправлен с использованием механизма в X509KeyManager
используется в SSLContext
используется SSLSocket
/SSLEngine
используется клиентом.
По умолчанию SSLContext
инициализирует свой менеджер ключей, используя javax.net.ssl.keyStore*
свойства системы. (Видеть этот ТАК ответ для разницы между "хранилищем ключей" и "хранилищем доверенных лиц": оба используют формат API / хранилища "хранилища ключей".)
Самый простой - настроить JVM под управлением Tomcat, в котором работает ваш клиент / веб-приложение, с этими javax.net.ssl.keyStore*
свойства. По умолчанию SSLContext
заберет его, и он используется по умолчанию для HTTPS-соединений (даже сторонние HTTPS-библиотеки будут его использовать).
Если вам нужно что-то более конкретное для конкретных запросов, вам может потребоваться изменить код веб-приложения, чтобы использовать конкретное хранилище ключей (или, по крайней мере, выбрать конкретный сертификат) в заданном SSLContext
для этого запроса.
Как вы настраиваете JVM, на которой запущен Tomcat, будет зависеть от сценария запуска. Если под Windows, этот вопрос должен помочь, иначе я подозреваю, что где-то в catalina.sh
где вы можете установить свойства системы.
Если вы все же настроите глобальный javax.net.ssl.keyStore*
для этого это повлияет на всю виртуальную машину, включая соединители. Чтобы соединители Tomcat не использовали это хранилище ключей, убедитесь, что <Connector />
конфигурация указывает собственное keyStore*
атрибуты (чтобы не использовать значения из свойств системы).
Если в вашем хранилище ключей есть несколько сертификатов (с закрытым ключом), выбор должен быть сделан автоматически в соответствии со списком CA, отправленным сервером в его CertificateRequest
сообщение. По умолчанию диспетчер ключей выбирает первый сертификат, который он найдет в настроенном хранилище ключей, который выдается ЦС из этого списка (или промежуточным ЦС). Если вам нужно что-то более конкретное (в частности, если в вашем хранилище ключей есть несколько допустимых кандидатов), вам нужно будет реализовать свой собственный X509KeyManager
, поместите логику в chooseClientAlias
, инициализировать SSLContext
с ним, и пусть любой API, который делает эти запросы, использует его.