具有 SSLRequire 和动态别名的 Apache 动态路径

具有 SSLRequire 和动态别名的 Apache 动态路径

我有 Apache/2.4.6 (Red Hat Enterprise Linux),根据我们颁发的 SSL 证书向不同客户提供一些内容。如果与SSL_CLIENT_S_DN_OU客户证书中的 OU 匹配,则允许他们访问/mydir/customerfolders/<OU>Web 服务器。

每个客户的证书都包含一个与/mydir/customerfolders/<OU> Web 服务器上的文件夹匹配的唯一 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 '@'

我在这里做错了什么..?:(我所要做的就是根据 OU 允许访问 /myserver/mydir 下的正确目录(例如 /myserver/mydir/cust1)....

我非常感谢您的意见。

谢谢J

答案1

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

相关内容