Spring Boot 重定向 HTTP 到 HTTPS

2022-08-31 22:42:28

对于基于Spring Boot的应用程序,我在appplicatial.properties上配置了ssl属性,请参阅此处的配置:

server.port=8443
server.ssl.key-alias=tomcat
server.ssl.key-password=123456
server.ssl.key-store=classpath:key.p12
server.ssl.key-store-provider=SunJSSE
server.ssl.key-store-type=pkcs12

我在应用程序上添加了连接.class,例如

@Bean
public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
    final TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.addAdditionalTomcatConnectors(this.createConnection());
    return factory;
}

private Connector createConnection() {
    final String protocol = "org.apache.coyote.http11.Http11NioProtocol";
    final Connector connector = new Connector(protocol);

    connector.setScheme("http");
    connector.setPort(9090);
    connector.setRedirectPort(8443);
    return connector;
}

但是当我尝试以下

http://127.0.0.1:9090/

重定向至

https://127.0.0.1:8443/

不执行。谁面临类似的问题?


答案 1

要使 Tomcat 执行重定向,您需要使用一个或多个安全约束对其进行配置。您可以通过使用子类对 进行后处理来执行此操作。ContextTomcatEmbeddedServletContainerFactory

例如:

TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
    @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将每个请求重定向到HTTPS。如果需要更好地控制重定向和未重定向的内容,则可以配置多个模式和多个约束。CONFIDENTIAL/*

上述子类的实例应使用类中的方法定义为 Bean。TomcatEmbeddedServletContainerFactory@Bean@Configuration


答案 2

在 application*.properties 文件上设置此属性(以及 HTTPS 标头的相应特定于 servlet 的配置,以防您在代理后面运行)并设置 Spring Security(例如,在类路径上具有 org.springframework.boot:spring-boot-starter-security)应该就足够了:

security.require-ssl=true

现在,由于某种原因,当禁用基本身份验证时,配置不被遵守(至少在旧版本的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();
    }
}

因此,如果您在代理后面使用 Tomcat,则应用程序 *.properties 文件上将具有所有这些属性:

security.require-ssl=true

server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto