Tomcat + SNI + взаимная аутентификация
Я знаю, что Tomcat обеспечивает SNI и взаимную аутентификацию, но возможно ли включить MA только для выбранных приложений / путей? Т.е. допустим, что на моем сервере есть следующие приложения / конечные точки:
/app1
/app2/human
/app2/robot
где /app2/human используется людьми, а /app2/robot используется роботами, компьютерами и другими устройствами (например, /app2/human обслуживает HTML, а /app2/robot обслуживает JSON). Теперь можно ли как-то настроить Tomcat на прием соединений с /app1 и /app2/human через SSL без MA и с /app2/robot только в том случае, если клиент предоставил действительный сертификат?
Конечно, я хочу сделать это без настройки отдельных портов / разъемов для каждого приложения, это легко.
Заранее спасибо.
2 ответа
Tomcat не обеспечивает выборочную взаимную аутентификацию для разных путей, но если вам нужно, чтобы такая выборочная взаимная аутентификация применялась только на уровне веб-приложений (а не внутри определенного веб-приложения), вы можете получить прочь с отдельным <Connector>
для специального веб-приложения. Это требует отдельного <Service>
и поэтому <Host>
и, конечно, другой номер порта (если у вас нет отдельного сетевого интерфейса, который вы можете использовать для сохранения портов).
Я не пробовал, но я бы предположил, что теоретически SNI+client-auth можно настроить так, чтобы конкретное имя хоста имело другие требования к аутентификации клиента, но в Tomcat нет такого кода для поддержки этого в настоящее время.
Tomcat можно настроить на использование другого хранилища доверенных сертификатов и другого certificateVerification
настройка для имени хоста, но это не позволяет вам изменить его для пути.
Другой вариант - настроить Tomcat на "получение" (или даже требование) клиентского сертификата, а затем выполнить проверку самостоятельно, используя Filter
, Filter
Их можно применять отдельно для каждого пути, кроме того, ваше приложение становится более переносимым, поскольку вы не полагаетесь на некоторые функции, которые могут зависеть от Tomcat.
Посмотрите на эту ветку, как я это сделал несколько лет назад. Есть (в конце концов) пример кода и множество ссылок на то, как я собрал всю информацию, чтобы собрать ее вместе: http://markmail.org/thread/vxwwli5nzt4itfr2
В соответствии с этим и читая документы, вы не можете иметь выборочную взаимную аутентификацию для каждого отдельного пути. Это все или ничего, потому что аутентификация клиента настроена на уровне соединителя. Вы, вероятно, ищете повторное соединение SSL с аутентификацией клиента, которая, вероятно, не реализована, как вы могли бы использовать из Apache HTTPd.