Spring Boot:不要发送 HSTS 标头

3
在开发环境中,我的浏览器(Yandex)将 OPTIONS 请求重定向(307)到 URL 的 https 版本,但由于我们没有设置 SSL,因此该请求会失败并显示错误 Response for preflight is invalid (redirect)
2个回答

4

我通过如下配置HSTS头解决了这个问题:

@Configuration
@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {
    ...
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    ...
          http.headers().httpStrictTransportSecurity()
              .maxAgeInSeconds(0)
              .includeSubDomains(true);
    }
}

禁用HSTS对我没有起作用。

1
这对我有用,但 http.headers().httpStrictTransportSecurity().disable() 对我也起作用。我正在使用Spring Boot 2.0.1.RELEASE并通过Chrome 66 DevTools验证了未发送HSTS头。 - sigint

3
如果您没有设置HTTPS,则不应读取HSTS值 - 浏览器必须忽略通过未加密的HTTP连接发送的HSTS。
如果您曾经设置过HTTPS,但现在不再使用(或者如果您在某些域/页面上使用HTTPS),则您的浏览器可能已经缓存了浏览器上次读取标题时设置的任何max-age值的HSTS设置。您需要在浏览器中清除此设置。如何操作因浏览器而异,但在所有浏览器中都可以使用的一种较简单的方法是发布一个具有0个最大年龄的新的HSTS标题,就像您所做的那样,并访问一个HTTPS页面(而不是未加密的HTTP)。这显然需要您拥有HTTPS设置,而您说您没有?在所有受影响的域名上,当您的浏览器都获得了新设置后,您可以完全停止发布该HSTS标头。
跳过重置步骤并在浏览器具有先前版本缓存的情况下关闭标头将不起作用-至少在浏览器的缓存版本在max-age时间后过期之前不会起作用。

谢谢确认我的想法--一些浏览器可能已经收到了HSTS头。在Chrome中,清除缓存有所帮助,但在Yandex中我找不到相同的方法。在chrome://net-internals/#hsts中删除子域不适用于我。浏览器是否会为每个子域缓存此设置? - Leukipp
它会按域名进行缓存。您可以添加includesubdomain属性,如果您访问该顶级域名并因此获取该策略,则将应用于所有子域。在该示例中,它仍然仅存储在顶级域中,并且浏览器检查完整域(sub.sub.example.com),然后检查缓存中的每个上级域以查找第一个匹配的策略(例如,在此示例中为sub.example.com,然后是example.com)。请注意,只有在客户访问其中一个域时才会加载策略(浏览器不会主动访问它们以查看是否存在HSTS策略)。 - Barry Pollard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接