我正在尝试将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
但是试图在没有这种方法的情况下完成它。
答案 0 :(得分:8)
如果您将证书作为标头传递,tomcat将不会自动意识到它,因为连接只是HTTP而不是HTTPS。您不必将certifcate作为请求属性,而是必须从标头中提取它并自己解析它。
您可以覆盖getPreAuthenticationCredentials
method in X509AuthenticationFilter
。有一些代码here显示了如何解码证书。
删除<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" />