Возможно ли иметь один и тот же и взаимный ssl для одного и того же веб-приложения в зависимости от URL
У меня есть сценарий, в котором у меня есть несколько остальных веб-сервисов, из которых немногие должны применять взаимный ssl, и немногие должны иметь только один способ ssl, здесь это то же самое веб-приложение.
Это возможно в tomcat/Spring-приложении?
3 ответа
Извините за поздний ответ, да, я сделал это, не уверен, что лучше, но вроде как взломать.
Шаг 1: У вас должен быть установлен односторонний SSL с clientAuth=want в вашем коте. Это исправит ваш сценарий, когда вы хотите, чтобы ssl в один конец для всех веб-сервисов принимал тот, который требует дополнительной / взаимной аутентификации.
Шаг 2: Теперь для веб-сервиса, который нуждается во взаимном ssl. Напишите фильтр сервлетов и для этого конкретного URL-адреса веб-службы проверьте входящий http-запрос на наличие сертификатов. Просмотрите все сертификаты, найденные в запросе, и сопоставьте их с сертификатами из вашего доверенного хранилища. если вы нашли совпадение, разрешите выполнение потока запросов, если не верните исключение, так как сертификат SSL не найден.
X509Certificate[] certificates = (X509Certificate[]) request
.getAttribute("javax.servlet.request.X509Certificate");
Приведенный выше код даст вам массив сертификатов в вашем запросе.
Примечание. Убедитесь, что конфигурация SSL верна, иначе переменная сертификата останется нулевой.
Если вы можете использовать разные хосты (предполагая, что клиент и сервер поддерживают SNI) или порты, то это не должно быть проблемой.
К сожалению, вы не можете изменить конфигурацию SSL в зависимости от пути URL-адреса, поскольку она доступна только после установления SSL-соединения. В этом случае единственным вариантом будет сделать клиентский сертификат необязательным и игнорировать любые сертификаты, отправленные для URL-адресов, которые не требуют его.
В любом случае, вам почти наверняка будет лучше, если что-то вроде Nginx или Apache httpd обрабатывает часть SSL и передает любые данные о сертификате клиента (или его отсутствии) в приложение Spring / Tomcat в заголовке HTTP.
Вы можете использовать TLS ("односторонний") для всего сайта, а затем запрашивать сертификат клиента только тогда, когда требуется аутентификация. Установите свой TLS <Connector>
"s clientAuth
приписывать want
и установите свой auth-method
в web.xml
быть CLIENT-CERT
, Это должно сделать это.