我已经设置了 Apache Web Server 2.4 作为 Apache Tomcat 7 的代理,通过 AJP 协议进行通信(< Apache端的em> mod_proxy_ajp 和Tomcat端的AJP连接器)。一切都非常适合基本功能。
现在,我希望设置一些特定的AJP属性,但不能让它工作......
查看 mod_proxy_ajp 页面(http://httpd.apache.org/docs/current/mod/mod_proxy_ajp.html),在请求数据包结构部分下,我看到了一个属性列表。这些属性包括 remote_user 和 ssl_cert (代码值 0x03 和 0x07 )。还有一个&#34;其他一切&#34;名为 req_attribute 的属性,代码值 0x0A ,可用于设置AJP请求中的任意属性。
此外,在同一页面的环境变量部分下,它说明了以下内容:
名称前缀为AJP_的环境变量将作为AJP请求属性(从密钥名称中删除AJP_前缀)转发到源服务器。
这看起来很简单,事实上,我很容易设置一个任意的AJP属性,例如&#34; doug-attribute&#34;通过设置名为&#34; AJP_doug-attribute&#34;的Apache环境变量,并分配相关值。在这样做之后,我可以使用Wireshark分析流量,并查看&#34; doug-attribute&#34;字段显示在解剖的AJP块中,前缀为十六进制值0x0A(&#34; req_attribute&#34;上面列出的类型)。到目前为止一切都很好。
现在我想尝试设置 ssl_cert 属性。以同样的方式,我设置了一个名为&#34; AJP_ssl_cert&#34;的环境变量。这样做,它确实出现在Wireshark中,但带有前缀代码&#34; 0x0A&#34;。此外,我的Java应用程序想要读取&#34; javax.servlet.request.x509certificate&#34;找不到证书。
但是,我还注意到Wireshark捕获中的一些其他属性 在网站上列出,例如 ssl_cipher 和 ssl_key_size 。但在捕获中,它们显示为&#34; SSL-Cipher&#34;和&#34; SSL-Key-Size&#34; (并有适当的&#34; 0x08&#34;和&#34; 0x0B&#34;前缀代码)。所以,我尝试再次设置cert属性,这次是&#34; SSL-Cert&#34;,但我得到的结果和以前一样。
为了进行比较,我将Apache配置更改为需要客户端证书,然后在访问关联网页时在浏览器中提供一个。此时,我看看Wireshark捕获,果然,现在有一个名为&#34; SSL-Cert&#34;的属性,代码为&#34; 0x07&#34;,我在Tomcat中的Web应用程序是成功找到证书。
有没有办法可以手动设置mod_proxy_ajp页面上列出的属性,或者模块是否能够以不同于其他任意请求属性的方式处理它们(例如&#34; doug-attribute&#34;)?我觉得必须有一些我在这里缺少的东西。
作为一些背景,我尝试这样做的原因是我有一个配置,其中多个Apache Web服务器相互代理,最后是一个Apache Web服务器通过AJP代理到Tomcat实例。所有Apache Web服务器都使用SSL并需要客户端证书。只有一台Apache服务器,Tomcat可以很好地接收用户的证书而无需我的任何特殊配置。但是,对于多个,它最终会收到先前Apache代理的服务器证书(使用SSLProxyMachineCertificateFile指令在该计算机上设置)。
我希望做的是将原始用户的证书放入中间代理请求的标头中,然后在后端的AJP属性中手动设置该证书,以便Tomcat中的Web应用程序可以阅读证书并使用它来执行其授权的东西(这部分已经一成不变,否则我只是将证书添加为标题并使Java应用程序读取标题)。
编辑:当然,如果有更简单的方法来通过代理链传递用户的证书,我会非常乐意听到它! :)