У меня есть Apache / 2.4.6 (Red Hat Enterprise Linux), обслуживающий некоторый контент для разных клиентов на основе их сертификатов SSL, которые мы выдаем. Если SSL_CLIENT_S_DN_OU
совпадает с OU в сертификате клиента, тогда им будет разрешен доступ к / mydir / customerfolders /
на веб-сервере.
Сертификат каждого клиента содержит уникальный OU, который соответствует папкам в / mydir / customerfolders /
на веб-сервере.
Пример сценария: cust1 имеет наш сертификат, содержащий OU = cust1
, поэтому они будут разрешены доступ к https: // mywebserver / customerfolders / cust1
, который в основном представляет собой папку на нашем веб-сервере: / mydir / customerfolders / cust1
.
Мне удалось создать динамический псевдонимы, использующие AliasMatch
, которые перенаправляют URL-адрес в нужную папку, однако я хотел бы пойти еще дальше, перенаправив динамический псевдоним на динамический путь - вместо того, чтобы определять индивидуальный < Каталог>
раздел для каждой папки клиента.
Примерно так:
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 есть следующее:
[Вт, 09 июн, 08:53: 24.624038 2020] [ssl: error] [pid 24991] [client IPADDRESSS: 49880] AH02229: не удалось получить доступ к / mydir / customerfolders / cust1, причина: выражение требования SSL не выполнено выполнено
Я не совсем уверен, возможен ли описанный выше метод или я использую его правильно.
Я хочу использовать 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}
) непосредственно в подобном регулярном выражении (это недопустимый синтаксис regex).
Возможно, вместо этого попробуйте что-то вроде следующего:
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/
?
Хотя следует не используете ли вы новый синтаксис... Require expr
?
SSLRequire устарел и должен быть заменен на Require expr.
Ссылка: https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslrequire