У меня есть Apache / 2.4.6 (Red Hat Enterprise Linux), обслуживающий некоторый контент для разных клиентов на основе их сертификатов SSL, которые мы выпускаем. Если SSL_CLIENT_S_DN_OU
соответствует OU в сертификате клиента, тогда им будет разрешен доступ к /mydir/customerfolders/<OU>
на веб-сервере.
Сертификат каждого клиента содержит уникальное подразделение, которое соответствует папкам в /mydir/customerfolders/<OU>
на веб-сервере.
Пример сценария: cust1 имеет наш сертификат, содержащий OU=cust1
, поэтому им будет разрешен доступ к https://mywebserver/customerfolders/cust1
, который в основном представляет собой папку на нашем веб-сервере: /mydir/customerfolders/cust1
.
Мне удалось создать динамические псевдонимы, используя AliasMatch
который перенаправит URL-адрес в нужную папку, однако я хотел бы сделать еще один шаг, перенаправив динамический псевдоним на динамический путь - вместо того, чтобы определять индивидуальный <Directory>
строфа для папки каждого клиента.
Что-то вроде :
AliasMatch "^/customerfolders/([a-zA-Z0-9]+)/(.+)" "/mydir/customerfolders/$1/$2"
<Directory "/mydir/customerfolders/$1">
SSLRequire %{SSL_CLIENT_S_DN_O} eq "MyCompany" \
and %{SSL_CLIENT_S_DN_OU} in {"$1"}
Require all granted
AllowOverride All
</Directory>
Я пробовал описанное выше, но получил запрещенный запрос, и в журнале ошибок SSL есть следующее:
[Tue Jun 09 08:53:24.624038 2020] [ssl:error] [pid 24991] [client IPADDRESSS:49880] AH02229: access to /mydir/customerfolders/cust1 failed, reason: SSL requirement expression not fulfilled
Я не совсем уверен, возможно ли описанный выше метод или правильно ли я его использую. Я хочу использовать Rewrite
но не знаю, как это исправить SSLRequire
директива.
Может ли кто-нибудь помочь мне указать правильное направление?
ОБНОВЛЕНИЕ: я почти там ... Мне просто нужно правильное регулярное выражение для этого:
SSLRequire %{REQUEST_URI} =~ m#^/mydir/%{SSL_CLIENT_S_DN_OU}/(.*)#
В настоящее время вышесказанное дало мне ошибку:
Failed expression: %{REQUEST_URI} =~ m#^/mydir/%{SSL_CLIENT_S_DN_OU}/(.*)#
Как я могу изменить регулярное выражение, чтобы оно соответствовало REQUEST_URI
(что должно быть /mydir/%{SSL_CLIENT_S_DN_OU}/test.html
Спасибо J
ОБНОВЛЕНО !! Спасибо, мистер Уайт! Я пробовал ваш код, как показано ниже:
RewriteCond %{REQUEST_URI} "!^(/myserver/%{SSL:SSL_CLIENT_S_DN_OU}/.*)" [NC]
RewriteRule "^/mydir/(.*)$" "/myserver/mydir/$1"
<Directory "/myserver/mydir">
AllowOverride None
SSLRequire %{SSL_CLIENT_S_DN_O} eq "MyCompany" \
and %{REQUEST_URI}@@%{SSL_CLIENT_S_DN_OU} =~ m#^/soc/([^/]+)/(.*)@@\1#
and %{SSL_CLIENT_I_DN_CN} eq "MyCA"
Require all granted
</Directory>
Однако он не работает с ошибкой:
SSLRequire: syntax error, unexpected T_ERROR: Parse error near '@'
Что я здесь сделал не так ..? :( Все, что я пытаюсь сделать, это разрешить доступ к нужным каталогам в / myserver / mydir (например, / myserver / mydir / cust1) на основе OU ....
Я очень ценю ваш вклад.
Спасибо J
SSLRequire %{REQUEST_URI} =~ m#^/mydir/%{SSL_CLIENT_S_DN_OU}/(.*)#
Я не верю, что вы не можете использовать серверную переменную (используя %{var}
синтаксис) непосредственно в таком регулярном выражении (это недопустимо регулярное выражение синтаксис).
Возможно, вместо этого попробуйте что-то вроде следующего:
SSLRequire %{REQUEST_URI}@@%{SSL_CLIENT_S_DN_OU} =~ m#^/mydir/([^/]+)/(.*)@@\1#
куда \1
это внутренняя обратная ссылка на первую захваченную группу (т.е. ([^/]+)
), который соответствует %{SSL_CLIENT_S_DN_OU}
. @@
это просто произвольная строка, которой нет в шаблоне.
Это предполагает SSL_CLIENT_S_DN_OU
содержит строку вида cust1
- не содержит слэшей.
Однако это основано на вашей попытке кода, что, по-видимому, противоречит тому, что вы указали в первой части вопроса: /mydir/customerfolders/<OU>
?
Хотя, разве вы не должны использовать новый синтаксис ... Require expr
?
SSLRequire is deprecated and should in general be replaced by Require expr.
Ссылка: https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslrequire