Назад | Перейти на главную страницу

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

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