Динамические пути Apache с SSLRequire и динамические псевдонимы

У меня есть 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

2
задан 18 June 2020 в 15:57
1 ответ
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

0
ответ дан 18 June 2020 в 11:02

Теги

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