0

OpenAM 中基于 Cert 的身份验证需要设置 http header X-Client-Cert。当 url 为 /openam/UI/Login?module=PKI 时,我想使用 apache 作为反向代理并设置此标头。

/openam/UI/Login 用于用户名和密码验证。

我有这个配置:

...
  ProxyPass / balancer://mycluster/ 
  ProxyPassReverse / balancer://mycluster/ 

  RequestHeader set X-Client-Cert ""

  <Location "/openam/UI/Login/PKI">
    RequestHeader set X-Client-Cert  "%{SSL_CLIENT_CERT}s"
    SSLVerifyDepth 10
    SSLVerifyClient require
  </Location>

  RewriteRule /openam/UI/Login/PKI balancer://mycluster/openam/UI/Login?module=PKI [P]
...

它可以解决问题,但代价是将 /openam/UI/Login?module=PKI 重写为 /openam/UI/Login/PKI ,我不喜欢它。

你能建议我如何在不重写的情况下做到这一点吗?

谢谢。

4

2 回答 2

2

使用 apache2.4 我可以这样做:

<If "%{QUERY_STRING} =~ /module=PKI/">
    RequestHeader set X-Client-Cert  "%{SSL_CLIENT_CERT}s"
    SSLVerifyDepth 10
    SSLVerifyClient require
<Else>
    RequestHeader set X-Client-Cert ""
</If>
于 2013-10-08T17:10:52.277 回答
0

我认为这可以使用SetEnvIf和的组合RequestHeader

用于SetEnvIf设置一个变量,指示 URI 用于正确的路径:

SetEnvIf Request_URI "/openam/UI/Login?module=PKI" x_client_cert=1

并使用可选env=[!]variable参数RequestHeader

RequestHeader set X-Client-Cert "%{SSL_CLIENT_CERT}s" x_client_cert=1

我的语法可能有点错误——尤其是 SetEnvIf 的第二个 (URI) 参数的转义和格式,但这种方法应该有效。

文档链接:

http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif

http://httpd.apache.org/docs/2.2/mod/mod_headers.html#requestheader

于 2013-10-07T12:11:32.190 回答