我已成功配置Apache(2.4.7)以要求客户端证书,并且 - 作为反向代理 - 将证书中的信息转发到Tomcat 8服务器。
但是当尝试使用Spring Boot完成相同操作时,它会以
失败The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /myapp
并返回HTTP 502错误代码。
相关的,有效的Tomcat配置是:
<Connector SSLEnabled="true" clientAuth="want" keyAlias="myalias"
keystoreFile="mystore.jks" keystorePass="mypassword" maxThreads="150"
port="8443" protocol="HTTP/1.1" scheme="https" secure="true"
sslProtocol="TLS" truststoreFile="mystore.jks" truststorePass="mypassword"/>
Spring Boot application.properties文件的相关部分无法工作:
server.context-path=/myapp
server.port=8443
server.ssl.enabled=true
server.use-forward-headers=true
server.ssl.protocol=TLS
server.ssl.client-auth=need
server.ssl.key-alias=myalias
server.ssl.key-store=/path/to/mykeystore.jks
server.ssl.key-store-password=mypassword
server.ssl.key-password=mypassword
server.ssl.trust-store=/path/to/mykeystore.jks
server.ssl.trust-store-password=mypassword
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.port-header=x-forwarded-port
注意,当直接访问应用程序时(即请求https://myapp.company.tld:12345/myapp),它运行正常,但使用反向代理(即https://proxy-load-balancer.company.tld:12345/myapp)会抛出上述错误。
端口差异(12345与配置的8443相比)是由于中间Docker层:反向代理和应用程序都在一个容器中运行,它们的开放端口(Apache为443,Tomcat / Spring Boot为8443)被映射到另一个港口,即12345。
答案 0 :(得分:0)
好的,所以这一切都得到了解决。首先,这个Spring安全设置
server.ssl.client-AUTH =需要
将始终强制您的嵌入式Tomcat要求提供证书,因此在客户端=&gt;反向代理=&gt; Tomcat情况下,您将无法进行身份验证,除非您使用AJP,不确定。
但事实证明,使用
server.ssl.client-AUTH =想
允许进一步处理您的请求以及人们通常做的是在反向代理级别处理证书并将一些信息转发到后端服务器(Tomcat,Jetty等)。
最后,开发人员必须调整他们的Spring Boot应用程序来处理后一种操作模式,即从转发的HTTP请求标头中提取数据,然后根据该标准继续进行身份验证。