我目前正在尝试设置一个只能使用 ssl 客户端证书访问的虚拟主机。保护主机已完成,但是我想设置一个根据值而不同的标头 SSL_CLIENT_S_DN_O 其中包含客户端证书主题组织的信息。
问题是,我无法检查提到的变量的内容。到目前为止,我已经尝试使用 例如
第一次尝试
<If "%{SSL_CLIENT_S_DN_O} == 'xxxx'">
Header set user_key "key"
</If>
第二次尝试
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_S_DN_O} "=xxxx"
RewriteRule - [E=key:key]
Header set user_key "%{key}e"
第三次尝试
SetEnvIfExpr "%{SSL_CLIENT_S_DN_O} == 'xxxx'" key=test
Header set user_key "key" ENV=key
但是,上述解决方案均无效。变量要么是空的,要么似乎丢失了。 检查 mod_ssl 变量的正确方法是什么?
先谢谢你! :-)
虚拟主机配置
<VirtualHost *:443>
ServerName www.Apache-Test.de
# activate SSL
SSLEngine on
# activate SSL for proxied traffic
SSLProxyEngine on
SSLCertificateFile "C:\Users\A675866\apache-certs\root\ca2\server.crt"
SSLCertificateKeyFile "C:\Users\A675866\apache-certs\root\ca2\server.key"
SSLCACertificateFile "C:\Users\A675866\apache-certs\root\ca2\ca.crt"
# Every Path needs a valid client cert to be accessed
<Location />
SSLOptions +FakeBasicAuth +StdEnvVars
SSLVerifyClient require
SSLRequireSSL
<RequireAll>
Require expr "%{SSL_CLIENT_S_DN_O} == 'xxxx'"
Require expr "%{SSL_CLIENT_S_DN_C} == 'xxxx'"
Require expr "%{SSL_CLIENT_S_DN_OU} in {'xxxx', 'yyyy', 'zzzz'}"
Require expr "%{HTTP_HOST} == 'www.Apache-Test.de'"
</RequireAll>
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_S_DN_O} "=xxxx"
RewriteRule - [E=key:key]
Header set user_key "%{key}e"
</Location>
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_S_DN_O} "=xxxx"
RewriteRule - [E=key:key]
Header set user_key "%{key}e"
<If "%{SSL_CLIENT_S_DN_O} == 'xxxx'">
Header set user_key "key"
</If>
SetEnvIfExpr "%{SSL_CLIENT_S_DN_O} == 'xxxx'" key=test
Header set user_key "key" ENV=key
</VirtualHost>
更新
因此,似乎在执行 If 条件之后评估变量。这会导致变量为空。
http://httpd.apache.org/docs/2.4/expr.html#functions
http://httpd.apache.org/docs/2.4/expr.html
http://httpd.apache.org/docs/2.4/mod/core.html#if
尽管如此,我需要一种方法来检查 mod_ssl 变量,以便我可以确定哪个客户端正在向我的 vhost 进行身份验证并相应地设置 RequestHeader。 有什么想法吗?