Рейтинг:1

Apache 2.4: требовать сертификат клиента только для методов, отличных от GET.

флаг br

У нас есть внутренняя служба, работающая по HTTP, с экземпляром Apache 2.4 (Debian Bullseye), установленным перед ней в качестве прокси для HTTPS. Apache и HTTPS запущены и работают, но есть дополнительные требования к клиентским сертификатам — в частности, запросы GET и HEAD могут выполняться анонимно, но все другие методы должны предоставлять действительный клиентский сертификат, соответствующий определенным условиям.

Программное обеспечение, которое мы создаем, нацелено на IIS, поэтому Apache для нас — нечто неизвестное (первоначальный разработчик с тех пор ушел). Наши попытки адаптировать унаследованную нами конфигурацию имеют часть конфигурации сайта (без директив пути к файлу сертификата) как:

SSLVerifyClient необязательно
SSLVerifyDepth 10

ProxyPass /internal http://<internalIP>:/internal
ProxyPassReverse /internal http://<internalIP>:/internal
SSLOptions +StdEnvVars

<Расположение/внутреннее>
  Отклонить заказ, разрешить
  Разрешить от всех

  <LimitExcept GET>
    SSLRequire ( %{SSL_CLIENT_S_DN_O} eq "(org)" и %{SSL_CLIENT_S_DN_OU} eq "(unit)" и %{SSL_CLIENT_S_CN} eq "(name)" )
  </LimitExcept>
</местоположение>

Мы еще не пробовали это с клиентским сертификатом, например. POST, потому что простой GET для https://<прокси>/внутренний теперь происходит сбой с ошибкой 403 и сообщением errors.log:

AH02229: не удалось получить доступ к прокси: http://{internalIP}/internal, причина: выражение требования SSL не выполнено

На первый взгляд это выглядит как SSLRequire проверка также применяется к GET, в отличие от <LimitExcept>.

Есть ли комбинация директив, которые мы можем использовать для получения желаемого поведения? (В идеале тот, который отходит от явно устаревшего SSLRequire также.)

Рейтинг:1
флаг in

Ты можешь использовать mod_ssl с базовой аутентификацией разрешать только тем, кто предъявил действующий сертификат. Вам необходимо изменить LimitExcept часть так:

<LimitExcept GET>
    AuthType Basic
    AuthName "no-GET thingy"
    Require ssl-verify-client
</LimitExcept>

Вы можете использовать любое количество и комбинацию Требовать операторы, поэтому, если вы хотите также проверить свойства сертификата, вы можете сделать что-то вроде этого:

<LimitExcept GET>
    AuthType Basic
    AuthName "no-GET thingy"
    <RequireAll>
        Require ssl-verify-client
        Require expr "'${SSL_CLIENT_S_DN_O}' == 'org'"
        Require expr "'${SSL_CLIENT_S_DN_OUT}' == 'theOU'"
        Require expr "'${SSL_CLIENT_S_DN_CN}' != 'notThisUser'"
    </RequireAll>
</LimitExcept>
T2PS avatar
флаг br
Это работает с точки зрения требования сертификата, есть ли способ включить проверки свойств сертификата?
флаг in
Я добавил пример проверки свойств сертификата клиента.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.