将客户端证书从Apache转发到Tomcat

时间:2013-02-05 21:23:00

标签: apache tomcat spring-security x509

我正在尝试将Apache Web服务器(SSL)上的x509客户端证书(我的浏览器上安装了测试证书)传递给Tomcat应用程序。我现在配置的方式是,应用程序的spring安全性没有找到证书(因此没有转发)。

DEBUG: [http-8080-1]  org.springframework.security.web.authentication.preauth.x509.X509AuthenticationFilter - No client certificate found in request.

Apache服务器ssl.conf文件配置如下(我省略了不相关的部分):

LoadModule ssl_module modules/mod_ssl.so

Listen 443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

NameVirtualHost *:443

<VirtualHost *:443>

    ...

    SSLVerifyClient require
    SSLVerifyDepth 2

    ...

    # initialize the SSL headers to a blank value to avoid http header forgeries
    RequestHeader set SSL_CLIENT_CERT ""
    RequestHeader set SSL_CLIENT_VERIFY ""

    # add whatever SSL_* variables needed to pass to web application
    RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
    RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s"

    RequestHeader add X-Forwarded-Scheme https

    ProxyPass /testcert http://127.0.0.1:8080/testcert
    ProxyPassReverse /testcert http://127.0.0.1:8080/testcert

</VirtualHost>

有没有办法在Apache中配置它,整个证书被转发到Tomcat服务器?我知道我可以使用ajp但是试图在没有这种方法的情况下完成它。

1 个答案:

答案 0 :(得分:8)

如果您将证书作为标头传递,tomcat将不会自动意识到它,因为连接只是HTTP而不是HTTPS。您不必将certifcate作为请求属性,而是必须从标头中提取它并自己解析它。

您可以覆盖getPreAuthenticationCredentials method in X509AuthenticationFilter。有一些代码here显示了如何解码证书。

Bean配置

删除<x509 />名称空间元素并将其替换为等效的bean。参考手册中有一个附录,解释了XML元素创建的bean。您的配置应如下所示:

<http entry-point-ref="http403">
    <custom-filter position="PRE_AUTH_FILTER" ref="x509Filter" />
</http>

<bean id="http403" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />

<bean id="x509Filter" class="YourExtendedX509AuthenticaitonFilter" />