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