Возможно ли иметь один и тот же и взаимный 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, Это должно сделать это.

Другие вопросы по тегам