#jboss #x509 #connector #truststore
#jboss #x509 #соединитель #truststore
Вопрос:
Я пытаюсь настроить SSL-соединения для веб-службы B2B, и мне необходимо выполнить аутентификацию клиента на сервере. Поскольку на сервере размещены URL-адреса, которые также доступны обычным пользователям через браузер, не все подключения к хосту должны выполняться с использованием клиентской аутентификации. Для проверки сертификата X509 вызывающих абонентов требуется только для определенных URL-адресов. Мы используем JBoss 5.x, который основан на Tomcat 5.x, поэтому у меня есть конфигурация соединителя следующим образом:
<Connector protocol="HTTP/1.1" SSLEnabled="true"
port="8443" address="${jboss.bind.address}" sslProtocol = "TLS"
scheme="https" secure="true" enableLookups="true" clientAuth="false"
keystoreFile="${jboss.server.home.dir}/conf/.myKeyStore"
keystorePass="password1" />
Как вы можете видеть, у меня настроено хранилище ключей, чтобы мы могли предоставить наш подписанный сертификат, и у меня есть clientAuth=false, поскольку конкретные URL-адреса, требующие авторизации клиента, будут настроены в web.xml вот так:
<security-constraint>
<web-resource-collection>
<web-resource-name>clientAuthResources</web-resource-name>
<url-pattern>/clientauth/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>authOnly</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>myRealm</realm-name>
</login-config>
<security-role>
<role-name>authOnly</role-name>
</security-role>
С помощью пользовательского модуля входа в систему JAAS я действительно могу заставить это работать, если в приведенной выше конфигурации соединителя я также укажу truststore, в котором есть сертификаты клиента. Вот в чем моя проблема. Учитывая настройку нашего приложения и способ масштабирования, каждая настройка сервера приложений jboss поддерживает определенную сегментацию наших пользователей, и я не хочу, чтобы хранилища доверия были настроены повсеместно в файловой системе. Нам нужно динамически загружать доверенные сертификаты в коде из нашей базы данных. Пользовательский модуль входа в систему JAAS выполняет это на веб-уровне, а также назначает роли, однако без соединителя truststore модуль входа в систему никогда не вызывается, соединение прерывается на уровне SSL до включения HTTP.
После долгих исследований в Интернете я решил, что мне нужен пользовательский X509TrustManager, настроенный в SSLContext / SSLSocketFactory, чтобы обойти это. Этот пользовательский менеджер доверия также будет проверять сертификаты клиентов на те, которые хранятся в нашей базе данных. Я создал этот пользовательский менеджер доверия, однако, похоже, я не могу его подключить. Кто-нибудь знает способ настроить это в jboss или tomcat 5.x? Я заметил, что в Tomcat 7 на соединителе доступна следующая конфигурация trustManagerClassName, однако для меня это не вариант. Я предполагаю, что это возможно, любая помощь приветствуется.
Ответ №1:
Вы можете написать свой собственный org.apache.tomcat.util.net.jsse.JSSEImplementation
и передать его полное имя класса в SSLImplementation
атрибуте вашего соединителя.
Смотрите примеры здесь:
- http://code.google.com/p/jsslutils/wiki/ApacheTomcatUsage
- http://code.google.com/p/jsslutils/source/browse/trunk/extra/apachetomcat5/src/main/java/org/jsslutils/extra/apachetomcat5/JSSLutilsImplementation.java
- http://code.google.com/p/jsslutils/source/browse/trunk/extra/apachetomcat5/src/main/java/org/jsslutils/extra/apachetomcat5/JSSLutilsJSSESocketFactory.java