Пользовательский SSL TrustManager для сервера приложений Java

#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 атрибуте вашего соединителя.

Смотрите примеры здесь: