Tomcat 9 端口8880下HSTS配置不生效问题咨询
第三方证书是否会导致HSTS配置异常
不会。合法的第三方CA签发的证书是浏览器信任的证书,完全满足HSTS的生效前提。反而自签名证书如果没有被手动加入浏览器信任列表的话,浏览器会直接忽略响应中的HSTS头,这和你测试的自签名环境正常、生产异常的现象完全相反,所以可以直接排除证书本身的问题。
排查步骤
- 确认访问基础规则
HSTS头仅会在HTTPS响应中返回,首先确认你访问生产8880端口时使用的是https://协议开头的地址,同时检查Tomcat的conf/server.xml中8880端口对应的Connector配置是否开启了SSLEnabled="true",确认该端口确实是HTTPS服务端口。 - 检查过滤器加载状态
- 首先确认生产环境Tomcat版本 >= 7.0.63,
HttpHeaderSecurityFilter是该版本之后才内置的过滤器,低版本Tomcat加载失败不会生效 - 查看Tomcat启动日志,排查是否有过滤器加载报错、类不存在、参数配置错误的相关异常
- 确认部署的应用自身的
WEB-INF/web.xml中没有配置同名的httpHeaderSecurity过滤器覆盖全局配置,也没有其他过滤器优先级更高,在响应返回前移除了HSTS头
- 首先确认生产环境Tomcat版本 >= 7.0.63,
- 绕开外层代理直接测试Tomcat
生产环境通常会在Tomcat前部署反向代理、WAF、SLB等中间件,这类组件大概率会主动清除或覆盖后端返回的安全头。你可以直接在生产服务器本地执行curl命令测试本地Tomcat的响应:
如果本地curl返回结果中能看到curl -v -k https://127.0.0.1:8880/Strict-Transport-Security头,说明问题出在前端中间件的配置,需要修改中间件规则允许该头透传,或者直接在中间件层面配置HSTS。 - 检查反向代理协议识别配置
如果Tomcat是被反向代理接入,需要确认你已经配置了RemoteIpValve正确识别代理传递的X-Forwarded-Proto头,否则Tomcat会认为请求走的是HTTP协议,不会返回HSTS头。需要在conf/server.xml的Host或Engine节点下添加如下配置:<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/> - 浏览器侧验证
可以清空浏览器缓存后使用隐私模式访问,避免本地旧的HSTS缓存或者其他插件干扰头的读取,也可以直接用F12控制台查看所有响应头,确认是否有拼写遗漏。
内容的提问来源于stack exchange,提问作者user1631072
相关产品推荐
相关产品推荐

