我有 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