我在使用 mod_proxy 将客户端 x509 证书从 Apache 转发到 Tomcat 时遇到了困难。
从观察和阅读一些日志来看,客户端 x509 证书似乎已被 Apache 接受。但是,当 Apache 向 Tomcat(其 clientAuth="want")发出 SSL 请求时,客户端 x509 证书似乎并未在 ssl 握手期间传递。
有没有合理的方法来查看 Apache 在与 Tomcat 握手期间对客户端 x509 证书做了什么?
这是我正在使用的环境:Apache/2.2.3 Tomcat/6.0.29 Java/6.0_23 OpenSSL 0.9.8e
这是我的 Apache VirtualHost SSL 配置:
<VirtualHost xxx.xxx.xxx.xxx:443>
ServerName xxx
ServerAlias xxx
SSLEngine On
SSLProxyEngine on
ProxyRequests Off
ProxyPreserveHost On
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel debug
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /usr/local/certificates/xxx.crt
SSLCertificateKeyFile /usr/local/certificates/xxx.key
SSLCertificateChainFile /usr/local/certificates/xxx.crt
SSLVerifyClient optional_no_ca
SSLOptions +ExportCertData
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass / https://xxx.xxx.xxx.xxx:8443/
ProxyPassReverse / https://xxx.xxx.xxx.xxx:8443/
</VirtualHost>
下面是我的 Tomcat SSL 连接器:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" address="xxx.xxx.xxx.xxx"
maxThreads="150" scheme="https" secure="true"
keystoreFile="/usr/local/certificates/xxx.jks" keypass="xxx_pwd"
clientAuth="want" sslProtocol="TLSv1" proxyName="xxx.xxx.xxx.xxx" proxyPort="443"
/>
SSL 重新协商可能存在问题吗?
我们的 Tomcat 实例中的 Truststore 是否存在问题?(我们正在使用具有合作伙伴组织 CA 的非标准 Truststore。)
有没有更好的日志记录 Apache SSL 内部发生的情况?例如客户端证书发生了什么,或者为什么当 tomcats 要求证书时它没有转发证书?
任何合理的帮助都将不胜感激。
感谢您的时间。
答案1
Apache 正在为与后端 tomcat 服务器的连接生成一个全新的 SSL 会话,因此客户端证书数据不会传递;具有证书的系统不再是客户端。
如果您同意 Apache 和 Tomcat 设备之间使用未加密的连接,则使用 AJP 代理连接 ( ProxyPass / ajp://x.x.x.x:8009/
) 而不是 SSL,并SSLOptions +ExportCertData
在 Apache 中添加指令,应该可以将证书数据传递给 Tomcat。有关传递证书信息的更多信息这里。