我之前曾将 Apache 2.2.17 作为反向代理运行,它将请求客户端身份验证(使用 SSLVerifyClient),并将该身份验证传递给 jetty/tomcat 应用程序 servlet 引擎。然后我的 Java 应用程序将从请求中读取该信息(x509Certificate)。
升级到新服务器时,我们决定迁移到最新版本的 Apache,但此过程似乎不再有效。Apache 仍要求客户端身份验证,但似乎不会将其传递给 Tomcat。
以下是工作(v2.2.17)httpd.conf 文件的相关部分:
<VirtualHost _default_:443>
ServerName xxxxxxxx
SSLEngine On
SSLCertificateFile conf/ssl-prod/xxxxxxxx.crt
SSLCertificateKeyFile conf/ssl-prod/xxxxxxxx.key
SSLCACertificatePath conf/ssl.certs/
<Location />
ProxyPass http://xxxxxxxx:8009/
ProxyPassReverse http://xxxxxxxx:8009/
Order deny,allow
Allow from all
</Location>
<Location /login/>
SSLVerifyClient optional
SSLVerifyDepth 10
ProxyPass http://xxxxxxxx:8009/
ProxyPassReverse http://xxxxxxxx:8009/
Order deny,allow
Allow from all
</Location>
</VirtualHost>
因此,它只是一个标准的 SSL 代理,直到用户进入“登录”文件夹中的页面,此时 apache 要求进行客户端身份验证。
我曾尝试设置一些其他变量,看看是否会导致 ProxyAddHeaders On ProxyPreserverHost On(和 Off)运行,但没有成功。
在迁移到 2.2.23 分支的最新版本时,我们也遇到了同样的问题,但当我们将使用的旧版本复制到新服务器时,它运行良好。唯一的区别是我们从 32 位服务器迁移到 64 位服务器(两者都是使用 ApacheLounge 可执行文件的 Windows)。
有任何想法吗?
答案1
您没有任何机制将有关经过身份验证的客户端的信息传递给 Tomcat 服务器。
AJP 是端口 8009 上默认使用的协议,而不是 HTTP - 并且它具有用于传递客户端证书数据的内置机制(只要SSLOptions +ExportCertData
在 Apache 中存在)。您确定不打算使用它吗?
如果没有,您需要在 Apache 和 Tomcat 应用程序中实现某种功能来处理此问题。可能是包含有关客户端证书信息的 HTTP 标头。