SpringBoot:tomcat重定向到HTTPS8443,不管我指定哪个https端口

wpx232ag  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(545)

我使用一种相当标准的方法将springboot的嵌入式tomcat从http重定向到https,这在许多教程中都有重复。该方法非常适用于端口http8080和https8443,在本教程中也将重复这些示例。但是,将这些端口的数量更改为较少使用的值会产生许多问题,如进一步所述。
教程中的方法如下所示。应用程序属性:

server.http.port=8080
server.http.interface=0.0.0.0

server.port: 8443
server.ssl.enabled: true
server.ssl.key-store: classpath:selfsigned.jks
server.ssl.key-store-password: password
server.ssl.key-store-type: JKS
server.ssl.key-alias: selfsigned

然后,附加http端口的配置:

@Component
public class HttpServer {
    @Value("${server.port}") int HTTPS_PORT;

    @Bean
    public ServletWebServerFactory servletContainer(@Value("${server.http.port}") int httpPort) {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setPort(httpPort);
        connector.setRedirectPort(HTTPS_PORT);
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }
}

最后,安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.cors().and().csrf().disable();
        http.requiresChannel().anyRequest().requiresSecure();
        http.headers().frameOptions().sameOrigin();
        http.portMapper()
                .http(Integer.parseInt(Prop.get("server.http.port")))
                .mapsTo(Integer.parseInt(Prop.get("server.port")));
    }
    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

与教程的唯一区别是,我禁用了中jar清单文件的扫描 TomcatServletWebServerFactory 否则就会有问题如果 tomcat-embed-jasper 包括在内(参见此处)。
这是:

server.http.port=8080
server.port: 8443

正如我所说的,它和教程中的一样完美。这是:

server.http.port=8080
server.port: 5001

重定向到https 8443,但8443没有任何内容,因为tomcat侦听8080和5001:

INFO 7360 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 5001 (https) 8080 (http) with context path ''

我扫描了一下 8443 我应用程序中的每个文件,包括源文件和二进制文件。没有一个 8443 在那里。我还使用调试器来验证中的值是否正确 setPort() , setRedirectPort() 以及 portMapper() .
这是:

server.http.port=5000
server.port: 5001

生产:

0:0:0:0:0:0:0:1 - - [28/Jan/2021:18:44:46 +0100] "GET /a HTTP/1.1" 302 -
0:0:0:0:0:0:0:1 - - [28/Jan/2021:18:44:46 +0100] "GET /a HTTP/1.1" 302 -
0:0:0:0:0:0:0:1 - - [28/Jan/2021:18:44:46 +0100] "GET /a HTTP/1.1" 302 -
0:0:0:0:0:0:0:1 - - [28/Jan/2021:18:44:46 +0100] "GET /a HTTP/1.1" 302 -
...

直到浏览器抱怨重定向太多。
现场测试 localhost ,具有无效证书,因此chrome请求安全异常。尽管如此,chrome还是将站点置于http严格的传输安全中,这一点可以在 chrome://net-internals/#hsts . SpringBoot是否会在hsts头文件中发送导致重定向到8443的内容?
总而言之,似乎 8080 以及 8443 有点特别,可能在tomcat或spring boot中声明。如何摆脱这些默认值?任何调试方法,例如重定向背后的原因?增加tomcat、spring引导日志的详细程度?
更新1禁用hsts,我修改了安全代码:

http.headers().frameOptions().sameOrigin()
            .httpStrictTransportSecurity().disable();

并被移除 localhost 从chrome的hsts,但它没有帮助。
更新2当应用程序在具有有效证书的外部服务器上运行时,问题仍然存在。
项目相关性:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>compile</scope>
    </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.projectreactor</groupId>
        <artifactId>reactor-spring</artifactId>
        <version>1.0.1.RELEASE</version>
    </dependency>

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题