使用 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. */
有问题的网络服务器是...
/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. */