#security #authentication #tomcat #client #web.xml
#Безопасность #аутентификация #tomcat #клиент #web.xml
Вопрос:
У меня есть две веб-службы (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>
Обновить:
Я попытался разделить службу на два ограничения:
<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:
Подход заключается в том, чтобы иметь два отдельных ограничения безопасности, даже если одно для общедоступной службы вообще не имеет ограничений (ни auth-constraint
, ни a 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 .
Комментарии:
1. Спасибо вам за ваш ответ. Я попробовал это, и я думаю, что здесь замешано что-то еще, потому что у меня все еще спрашивают сертификат. Если вместо https я использую http:443 затем я получаю странных персонажей. Есть какие-нибудь идеи?
2. @Codo, похоже, что Tomcat всегда запрашивает аутентификацию клиента (server.xml проверяется перед web.xml , это имеет смысл), так что я не думаю, что то, что вы упомянули, может сработать … 😕
3. Спасибо,@Codo. По-видимому, ничего не делает… Смотрите мое обновление выше в вопросе
4. @Codo, и для разных соединителей … должно ли это работать? Потому что, если у меня есть один соединитель без clientAuth, он все равно будет обслуживать «MyProtectedService», не так ли? Или есть способ ограничить сервлет внутри приложения WAR?
5. Были необходимы два соединителя (один HTTPS с clientAuth, другой HTTP), а затем web.xml настройка для обоих сервлетов. Спасибо @Codo