Apache 2.4:Сертификат клиента требуется только для не-методов GET

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

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

SSLVerifyClient optional
SSLVerifyDepth 10

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

<Location /internal>
  Order deny,allow
  Allow from all

  <LimitExcept GET>
    SSLRequire ( %{SSL_CLIENT_S_DN_O} eq "(org)" and %{SSL_CLIENT_S_DN_OU} eq "(unit)" and %{SSL_CLIENT_S_CN} eq "(name)" )
  </LimitExcept>
</Location>

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

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

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

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

0
задан 21 October 2021 в 08:40
1 ответ

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

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

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

<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>
1
ответ дан 21 October 2021 в 13:43

Теги

Похожие вопросы