Skip to content
Advertisement

Require HTTPS with Spring Security behind a reverse proxy

I have a Spring MVC application secured with Spring Security. The majority of the application uses simple HTTP to save resources, but a small part processes more confidential information and requires an HTTPS channel.

Extract from the security-config.xml :

<sec:http authentication-manager-ref="authenticationManager" ... >
    ...
    <sec:intercept-url pattern="/sec/**" requires-channel="https"/>
    <sec:intercept-url pattern="/**" requires-channel="http"/>
</sec:http>

All worked fine until we decided to migrate it to the main server, where the application servers run behind reverse proxies. And as now HTTPS is processed by the reverse proxies the application server only sees HTTP requests, and disallows access to the /sec/** hierarchy.

After some research, I found that the proxies add a X-Forwarded-Proto: https header (*), but in Spring Security HttpServletRequest.isSecure() is used to determine the channel security offered (extract from SecureChannelProcessor javadoc).

How can I tell Spring Security that a X-Forwarded-Proto: https header is enough for a secure request?

I know I could report that part on proxies configuration, but the proxies administrator really does not like that solution, because there are many application behind the proxies and the configuration could grow to a non manageable state.

I an currently using Spring Security 3.2 with XML config, but I’m ready to accept answers based on Java config and/or more recent version.

(*) Of course, the proxies remove the header if it was present in incoming request, so the application can be confident in it.

Advertisement

Answer

If your site is HTTPS and you’re running Apache Tomcat behind another system that’s handling TLS termination, you can tell Tomcat to “pretend” that it’s handling the TLS termination.

This makes request.isSecure() return true;

To do so, you need to add secure="true" to your Connector config in server.xml.

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

See also the scheme attribute.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement