Настройка использования сертификата HTTPS на основе URL в Tomcat - PullRequest
5 голосов
/ 20 ноября 2010

Я разрабатываю веб-приложение, которое использует клиентские сертификаты для аутентификации в Tomcat во время вызовов веб-службы с Джерси.Пока это прекрасно работает, но мне нужен веб-интерфейс в том же контексте, который позволит мне администрировать это приложение.Поскольку конфигурация SSL «для контекста», единственной возможностью использовать внешний интерфейс https является установка клиентского сертификата в браузер, который обращается к нему, который также указан в хранилище доверенных сертификатов tomcat (либо вообще не учитывает использование https).

Чтобы проиллюстрировать, что я действительно хочу:

1. https://url-to-webapp/ws <- Should use client certificate
2. https://url-to-webapp/web <- Should just use a server certificate

Может ли это быть достигнуто каким-либо образом в конфигурации Tomcat или даже в коде приложения?

Обновление

Я попробовал конфигурацию, предложенную EJP, но теперь я не могу подключиться к Tomcat независимо от того, как я использую сертификаты - похоже, он не работает во время поиска или что-то в этом роде.Если я создаю HTTP-коннектор на 8080, он перенаправляет меня на 8443. Это конфигурация, которую я использую.Есть идеи?

tomcat-users.xml

<tomcat-users>
<role rolename="webservice"/>
<user username="CN=ClientCert,OU=Corp,O=Corp,L=London,S=London,C=UK" password="" roles="webservice"/>
</tomcat-users>

server.xml

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="c:\tomcat\keys\server.jks" keystorePass="password"
truststoreFile="c:\tomcat\keys\client.jks" truststorePass="password"/>

web.xml

[...]
    <security-constraint>
        <display-name>ClientCertificateRequired</display-name>
        <web-resource-collection>
            <web-resource-name>MyWebService</web-resource-name>
            <description/>
            <url-pattern>/webservice/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>webservice</role-name>
        </auth-constraint>
        <user-data-constraint>
            <description/>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    <login-config>
        <auth-method>CLIENT-CERT</auth-method>
        <realm-name>tomcat-users</realm-name>
    </login-config>
    <security-role>
        <description/>
        <role-name>webservice</role-name>
    </security-role>
    [...]
    <servlet>
        <display-name>Webservice</display-name>
        <servlet-name>Webservice</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        [...]
            <run-as>
            <role-name>webservice</role-name>
        </run-as>
    </servlet>
    [...]

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Вы можете настроить Tomcat на использование повторного согласования сертификата клиента (в отличие от первоначального согласования), чтобы запрос клиентского сертификата или нет зависел от запрошенного URL-адреса.

Для этого вам необходимо использовать clientAuth="false" в конфигурации соединителя, а затем <auth-method>CLIENT-CERT</auth-method> в веб-приложении, которое вы хотите защитить с помощью сертификата клиента.

Обратите внимание, что при этом используется повторное согласование, и поэтому вам, возможно, придется иметь дело с ошибками повторного согласования TLS. Короче говоря, в ноябре 2009 года был опубликован недостаток протокола TLS. Немедленное исправление безопасности состояло в том, чтобы отключить повторное согласование (если не используется небезопасный вариант), а затем внедрение RFC 5746. См. Исправления фазы 1 и 2 в разделе Readme .

Проблема пересмотра Oracle Java TL.

Для того, что вы пытаетесь сделать, вам нужно включить повторное согласование, и для того, чтобы это было безопасно, вам придется использовать JRE версии 1.6.0_22.

2 голосов
/ 21 ноября 2010

Просто определите первый URL-адрес как защищенный, требующий конфиденциальности и определенной роли, и определите веб-приложение как использующее аутентификацию клиента SSL.Определите второй URL как не требующий роли.Это все в web.XML.Затем определите себе подходящее Царство, с которым вы будете проверять личность и получать роли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...