Tomcat безопасный доступ - PullRequest
2 голосов
/ 13 июня 2011

У меня есть две веб-службы (MyService и MyProtectedService). Я хочу, чтобы оба проходили под одним и тем же портом HTTPS, но только защищенный имел аутентификацию клиента (clientAuth = true).

Вся защита работает нормально, но проблема в том, что аутентификация клиента включена для обеих служб, а не только для защищенной. Я хотел бы удалить аутентификацию клиента для одного из них или применить аутентификацию клиента только для другого.

У кого-нибудь есть подсказка? Спасибо

В web.xml:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>protected element</web-resource-name>
        <description/>
        <url-pattern>/MyProtectedService</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

UPDATE: Я попытался разделить службу на два ограничения:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>OpenService</web-resource-name>
        <description/>
        <url-pattern>/OpenService</url-pattern>
    </web-resource-collection>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <description/>
        <url-pattern>/MyProtectedService</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    <login-config>
        <auth-metod>CLIENT-CERT</auth-metod>
    </login-config>
</security-constraint>

И ClientAuth = false в server.xml.

Но тогда я могу получить к нему доступ без какой-либо аутентификации клиента: https://MACHINE/MyProtectedService/MyProtectedService?wsdl

1 Ответ

2 голосов
/ 13 июня 2011

Подход состоит в том, чтобы иметь два отдельных ограничения безопасности , даже если у общедоступной службы нет никаких ограничений вообще (ни auth-constraint, ни user-data-constraint).Предполагается, что две службы имеют разные URL-адреса, что, скорее всего, имеет место:

<security-role>
    <role-name>ProtectedServiceRole</role-name>
</security-role>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Public Service</web-resource-name>
        <url-pattern>/PublicService/*</url-pattern>
    </web-resource-collection>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Protected Service</web-resource-name>
        <url-pattern>/ProtectedService/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    <auth-constraint>
        <role-name>ProtectedServiceRole</role-name>
    </auth-constraint>
</security-constraint>

Имя роли, указанное в auth-constraint, инициирует аутентификацию.

Обновление:

Боюсь, я неправильно прочитал ваш вопрос и пропустил часть проверки подлинности сертификата.Несмотря на то, что я использовал его в прошлом, у меня никогда не было смешанной настройки, которая вам нужна, поэтому я могу дать только некоторые варианты, которые вы можете попробовать затем:

В настоящее время вам требуется аутентификация на транспортном уровне.Это на низком уровне и слишком рано.Вы пробовали установить clientAuth в false и вместо этого добавить следующие строки в ваш web.xml:

<login-config>
    <auth-method>CLIENT-CERT</auth-method>
</login-config>

Другой подход заключается в использовании двух разных портов длядве услуги.Для этого вы определяете два разных соединителя в файле server.xml.

...