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

Use SetEnvIf To Change A Variable Based Upon SSL_CLIENT_M_SERIAL Value

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

/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

(问题是 "user" 设置为空。)现在,如果我只想打开闸门,让 每个人 进入休息服务,我可以在 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 是一回事)确实接受了 "user" 作为传递来自 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 变量?

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