У нас есть внутренняя служба, работающая по 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
.)
Вы можете использовать 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>