2014-03-25 53 views
12

如何轻松配置嵌入式tomcat服务器将所有http通信重定向到https?我有一个弹性负载均衡器后面的ec2实例运行Spring Boot。我已经配置了ELB来处理我的SSL(这非常棒),并且它将X-FORWARDED-PROTO头设置为“https”。我想检测何时未设置,并重定向用户强制他们使用https,如果他们还没有。如何使用Spring Boot自动重定向到https

到目前为止,我已经尝试添加以下到我的application.properties没有运气文件:

server.tomcat.protocol-header=x-forwarded-proto 
security.require-ssl=true 
+0

你有一个安全的应用程序(是春季安全的类路径和它拦截你的请求)?请注意,即使这样,重定向也不是自动的(Spring Security与HSTS协同工作,要求客户端理解并遵守头文件中的指令)。 –

+1

嗨。你解决了这个问题吗?我们正面临类似的问题。我们有一个ec2负载均衡器,终止ssl并使用http回到Spring启动应用程序。我们可以从负载均衡器中删除https监听器,但我们宁愿做一个重定向到https。 – hermansen

+0

[Spring Boot重定向HTTP到HTTPS]的可能重复(http://stackoverflow.com/questions/26655875/spring-boot-redirect-http-to-https) –

回答

8

我的回答是有点晚了,但我刚刚有这个问题,要张贴这为我工作的解决方案。

最初,我认为将tomcat设置为使用X-Forwarded标头就足够了,但Tomcat的RemoteIPValve(通常应该处理这种情况)不适用于我。

我的解决办法是增加一个EmbeddedServletContainerCustomizer并添加ConnectorCustomizer: (请注意,我使用Tomcat 8此处)

@Component 
public class TomcatContainerCustomizer implements EmbeddedServletContainerCustomizer { 

    private static final Logger LOGGER = LoggerFactory.getLogger(TomcatContainerCustomizer.class); 

    @Override 
    public void customize(final ConfigurableEmbeddedServletContainer container) { 
     if (container instanceof TomcatEmbeddedServletContainerFactory) { 
       final TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container; 
       tomcat.addConnectorCustomizers(connector -> { 
        connector.setScheme("https"); 
        connector.setProxyPort(443); 
       }); 
       LOGGER.info("Enabled secure scheme (https)."); 
     } else { 
      LOGGER.warn("Could not change protocol scheme because Tomcat is not used as servlet container."); 
     } 
    } 
} 

重要的是,你不仅设置计划,HTTPS,但也ProxyPort没有从春天启动所有内部重定向路由到端口80

希望帮助:-)

1

配置属性security.require-S当基本身份验证被禁用时(至少在旧版本的Spring Boot上),sl不起作用。所以,你可能需要用类似的代码手动保证所有的请求这一个:

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Inject private SecurityProperties securityProperties; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     if (securityProperties.isRequireSsl()) http.requiresChannel().anyRequest().requiresSecure(); 
    } 
} 

您可以检查我的完整的答案在这里:Spring Boot redirect HTTP to HTTPS