Пользовательский SSL TrustManager для сервера приложений Java - PullRequest
2 голосов
/ 19 октября 2011

Я пытаюсь настроить SSL-соединения для веб-службы, которая является B2B, и мне нужно выполнить аутентификацию клиента на сервере.Поскольку на сервере размещены URL-адреса, которые также доступны обычным пользователям через браузер, не все подключения к хосту должны выполнять клиентскую аутентификацию.Только определенные URL-адреса требуют аутентификации клиента для проверки сертификата вызывающего абонента X509.Мы используем 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 я действительно могу заставить это работать, ЕСЛИ в соединителеконфиг выше я также определил склад доверенных сертификатов, который имеет клиентские сертификаты.Вот где моя проблема.Учитывая настройку нашего приложения и то, как мы масштабируем, каждая настройка сервера приложений jboss поддерживает определенную сегментацию наших пользователей, и я не хочу, чтобы хранилища доверенных сертификатов настраивались повсеместно в файловой системе.Нам нужно динамически загружать доверенные сертификаты в коде из нашей базы данных.Настраиваемый модуль входа в систему JAAS делает это на веб-уровне и также назначает роли, однако без хранилища доверенных сертификатов соединитель никогда не вызывает модуль входа в систему, соединение прерывается на уровне SSL, прежде чем задействуются HTTP-гетты.

После долгих исследованийя определил, что мне нужен пользовательский X509TrustManager, настроенный в SSLContext / SSLSocketFactory, чтобы обойти это.Этот пользовательский менеджер доверия также будет проверять клиентские сертификаты, которые хранятся в нашей базе данных.Я создал этот собственный менеджер доверия, но не могу его подключить.Кто-нибудь знает способ настроить это в jboss или tomcat 5.x?В Tomcat 7 я заметил следующую конфигурацию, доступную для соединителя, trustManagerClassName, однако это не вариант для меня.Я предполагаю, что это возможно, любая помощь очень ценится.

1 Ответ

0 голосов
/ 06 декабря 2011

Вы можете написать свой собственный org.apache.tomcat.util.net.jsse.JSSEImplementation и передать его полное имя класса в атрибуте SSLImplementation вашего соединителя.

См. Примеры здесь:

...