使用SetEnvIf基于SSL_CLIENT_M_SERIAL值更改变量

时间:2015-05-08 21:29:51

标签: apache tomcat setenv setenvif

有问题的网络服务器是......

/usr/sbin/apache2 -v
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Mar 10 2015 13:05:59

httpd.x.conf文件的一部分......

SSLVerifyClient optional 
SSLVerifyDepth 3
SSLOptions +StdEnvVars +ExportCertData

SetEnvIf SSL_CLIENT_M_SERIAL "5174EAF60000000014E5" JK_REMOTE_USER=Rest

但是mod_jk.log中的结果是......

[date and time junk] [debug] init_ws_service::mod_jk.c (1097): Service protocol=HTTP/1.1 method=GET ssl=true host=(null) addr=10.2.0.85 name=local.apiclient.com port=443 auth=(null) user=(null) laddr=10.2.1.173 raddr=10.2.0.85 uri=/the/thing/i/requested

(问题在于"用户"设置为null。)现在,如果我想打开闸门并让每个人进入休息服务,我可以做这在httpd.x.conf文件中......

SetEnv JK_REMOTE_USER Rest

...代替上面看到的SetEnvIf语句,然后mod_jk.log显示了这个......

[date and time junk] [debug] init_ws_service::mod_jk.c (1097): Service protocol=HTTP/1.1 method=GET ssl=true host=(null) addr=10.2.0.85 name=local.apiclient.com port=443 auth=(null) user=Rest laddr=10.2.1.173 raddr=10.2.0.85 uri=/the/thing/i/requested

立即注意" user = Rest" - 功能正常。而tomcat方面(OK,JBoss ......好吧,实际上是WildFly ......但实际上它和tomcat一样)确实接受了"用户"从apache传递,并授予适当的权限。

关键是即使... my.local.domain / cgi-bin / printenv告诉我apache环境知道一堆变量和值,包括     SSL_CLIENT_M_SERIAL = 5174EAF60000000014E5 ...好像SetEnvIf本身无法确定SSL_CLIENT_M_SERIAL的值,并根据其值,设置其他变量'值。

我也可以将其余服务用户ID配置为与其中一个SSL_CLIENT变量的值相同。就像电子邮件地址或序列号一样。所以,如果我能得到以下任何一个......

SetEnv JK_REMOTE_USER SSL_CLIENT_M_SERIAL
SetEnv JK_REMOTE_USER %{SSL_CLIENT_M_SERIAL}x
SetEnv JK_REMOTE_USER "SSL_CLIENT_M_SERIAL"

......那会很棒。我很遗憾,我很遗憾。

请不要使用特定于PHP的答案。这根本不是PHP环境。它甚至没有安装,也不会安装。

TLDR :如何根据SSL_CLIENT_M_SERIAL的值设置JK_REMOTE_USER变量?

1 个答案:

答案 0 :(得分:2)

我无法让SetEnvIf使用mod_ssl环境变量。

但它适用于SetEnvIfExpr

SetEnvIfExpr "%{SSL_CLIENT_M_SERIAL} == '5174EAF60000000014E5'" JK_REMOTE_USER=Rest

刚刚找到mod_ssl代码的原因:

/* ssl_hook_ReadReq needs to use the BrowserMatch settings so must
 * run after mod_setenvif's post_read_request hook. */