如何使用Spring Boot自动重定向到https

时间:2014-03-25 04:52:16

标签: spring amazon-ec2 spring-security spring-boot

如何轻松配置嵌入式tomcat服务器以将所有http流量重定向到https?我在一个弹性负载均衡器后面的ec2实例上运行Spring Boot。我已经将ELB配置为为我处理ssl(这很棒)并且它将X-FORWARDED-PROTO标头设置为" https"。我想检测何时没有设置,并重定向用户以强制他们使用https(如果他们已经没有。)

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

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

4 个答案:

答案 0 :(得分:9)

我的回答有点晚,但我最近遇到了这个问题,想发布一个对我有用的解决方案。

最初,我认为将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.");
        }
    }
}

重要的是,您不仅要将Scheme设置为https,还要设置ProxyPort,否则Spring Boot的所有内部重定向都将路由到端口80。

希望有所帮助: - )

答案 1 :(得分:2)

配置属性 security.require-ssl 在禁用基本身份验证时不起作用(至少在旧版本的Spring Boot上)。因此,您可能需要使用与此类似的代码手动保护所有请求:

@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

答案 2 :(得分:0)

您将需要一个密钥库文件和几个配置类。

以下链接详细说明了这一点。

Https on embedded tomcat

答案 3 :(得分:0)

Spring Boot 2.0将http重定向到https:

将以下内容添加到@Configuration

   @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector(
                TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }