有问题的网络服务器是......
/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变量?
答案 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. */