Windows Server 2016 IIS中HSTS头的测试、验证及问题修复
HSTS头检测异常的验证与修复方案(Windows Server 2016 + IIS)
一、验证HSTS头的真实存在性
浏览器缓存、扫描目标偏差都可能导致你看到的结果和扫描工具不一致,按以下步骤排查:
用命令行工具直接检测
避免浏览器缓存干扰,使用curl或PowerShell直接请求HTTPS站点:- curl命令:
curl -I https://你的域名 --insecure(--insecure用于跳过自签证书验证),查看输出中是否包含Strict-Transport-Security: max-age=31536000 - PowerShell命令:
Invoke-WebRequest -Uri https://你的域名 -UseBasicParsing | Select-Object -ExpandProperty Headers,检查返回的Headers集合中是否存在Strict-Transport-Security字段
- curl命令:
排查浏览器缓存影响
打开浏览器隐私/无痕窗口,重新访问站点并查看响应头。普通模式下浏览器可能缓存了之前的HSTS记录,导致你看到的是缓存后的结果。确认扫描工具的目标参数
检查安全扫描工具的配置:- 是否扫描的是HTTPS端口(443),而非HTTP端口(80)?HSTS头仅能在HTTPS响应中返回,若工具扫描HTTP端口,必然会提示缺失
- 是否包含子域名扫描?默认HSTS仅作用于当前域名,若工具扫描子域名且你未配置
includeSubDomains参数,也会触发缺失提示
二、若确实存在问题的修复方案
1. 全局配置HSTS头(覆盖所有站点)
打开IIS管理器,选择服务器节点,双击HTTP响应头,点击「添加」:
- 名称:
Strict-Transport-Security - 值:
max-age=31536000(如需覆盖子域名,改为max-age=31536000; includeSubDomains)
2. 单站点精准配置(通过web.config)
编辑目标站点根目录的web.config文件,在<system.webServer>节点下添加:
<httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" /> </customHeaders> </httpProtocol>
若已有<customHeaders>节点,直接插入<add>标签即可。
3. 排查模块冲突
检查站点是否使用URL重写或其他HTTP模块,部分规则可能会意外移除响应头。查看重写规则的「服务器变量」配置,确保未对Strict-Transport-Security头进行删除或修改操作。
4. 处理HTTP端口扫描告警(可选)
若扫描工具因扫描HTTP端口触发告警,建议开启HTTP到HTTPS的重定向(即使之前关闭),确保所有请求最终通过HTTPS返回HSTS头;若无需重定向,可在扫描工具中将HTTP端口排除出检测范围。
内容的提问来源于stack exchange,提问作者sam sergiy klok
相关产品推荐
相关产品推荐

