Apache 2.4 代理服务器获取客户端身份验证但未将其传递给 tomcat

Apache 2.4 代理服务器获取客户端身份验证但未将其传递给 tomcat

我之前曾将 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 标头。

相关内容