2

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

/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

(问题是“用户”设置为空。)现在,如果我只想打开闸门并让每个人都进入其余服务,我可以在 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 变量?

4

1 回答 1

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. */
于 2015-09-04T11:03:50.463 回答