一尘不染

使用SetEnvIf更改基于SSL_CLIENT_M_SERIAL值的变量

tomcat

有问题的网络服务器是…

/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方面(好吧,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变量?


阅读 326

收藏
2020-06-16

共1个答案

一尘不染

我从未能够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. */
2020-06-16