设置了HSTS头但浏览器还是提示不安全,哪里出问题了?
我给项目加了Strict-Transport-Security头,代码是这样写的:
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
但访问页面时浏览器地址栏还是显示不安全的警告。用开发者工具看响应头确实有这个字段,甚至用curl检查也显示存在:
curl输出显示:
$ curl -I https://example.com
HTTP/2 200
server: nginx
strict-transport-security: max-age=31536000; includeSubDomains
...
已经试过清除浏览器缓存、换不同设备测试,问题依旧。明明配置正确为什么还是不行?难道是子域名配置有问题?或者需要预加载列表?
注意几点:第一,确保你的SSL证书是受信任的CA签发的,自签名证书浏览器不会认;第二,检查是否所有资源都通过HTTPS加载,包括图片、脚本、样式表等,混合内容会导致不安全警告。
另外,你提到子域名问题,如果主域名和子域名共用HSTS,必须保证它们的SSL证书都正确配置。至于预加载列表,那是锦上添花的东西,先解决证书问题再说。
建议用以下命令检查证书链是否完整:
最后吐槽一句,处理HTTPS问题真是够折腾的,特别是证书链不完整的时候,排查起来特别费劲。
另外需要说明的是,HSTS对首次访问不起作用,因为浏览器还没收到这个头信息。所以即使配置正确,第一次访问还是可能提示不安全。解决方法是把域名加入HSTS预加载列表,但这个生效时间可能会比较长。
还有个容易忽略的问题是端口,有些浏览器对非标准HTTPS端口不会应用HSTS策略。确保你用的是443端口。
最后提醒一下,你的代码里写了includeSubDomains,这要求所有子域名都必须使用HTTPS,否则会影响HSTS效果。如果子域名没配好HTTPS,也会导致这个问题。
建议你先检查证书和端口配置,应该能找到问题所在。