如何搭建HTTP严格传输安全协议?HSTS配置教程
- 云服务器
- 2026-07-05
- 21
HTTP 严格传输安全(HSTS, HTTP Strict Transport Security)是一种 Web 安全策略机制,它允许 Web 服务器声明浏览器或其他用户代理只能使用 HTTPS 连接访问该资源,启用 HSTS 可以有效防止 SSL 剥离攻破、Cookie 截持以及中间人攻破,是提升网站安全性的重要步骤。
以下是搭建和配置 HSTS 的详细指南,涵盖原理、配置方法及常见 Web 服务器的具体操作。
前置条件:确保证书有效
在启用 HSTS 之前,必须确保您的网站已经正确配置了有效的 SSL/TLS 证书,如果证书无效、过期或配置错误,启用 HSTS 后用户将无法访问您的网站,且由于 HSTS 的强制特性,用户很难通过浏览器设置绕过此限制。
- 验证 HTTPS 可用性:确保 https://yourdomain.com 可以正常访问且无证书警告。
- HTTP 自动跳转:建议配置 Web 服务器,将所有 HTTP 请求自动重定向到 HTTPS。
HSTS 策略头详解
HSTS 通过 HTTP 响应头 Strict-Transport-Security 来生效,该头部包含以下关键参数:
| 参数 | 说明 | 建议值 |
|---|---|---|
| max-age | 指定浏览器应记住 HSTS 策略的时间(秒)。 | 至少 31536000(1年) |
| includeSubDomains | 可选,如果存在,策略将应用于所有子域名。 | 建议添加(若子域名也使用 HTTPS) |
| preload | 可选,请求将域名加入浏览器的 HSTS 预加载列表。 | 仅在确认长期稳定使用 HTTPS 时添加 |
示例头部:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
主流 Web 服务器配置方法
Nginx 配置
在 Nginx 中,可以通过 add_header 指令添加 HSTS 头,通常将其放在 server 块中,确保所有 HTTPS 请求都携带该头部。
server { listen 443 ssl http2; server_name example.com www.example.com; # SSL 证书配置 ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # 添加 HSTS 头 # 注意:在生产环境启用 preload 前,务必先测试不带 preload 的情况 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; location / { root /usr/share/nginx/html; index index.html; } }
- always 参数:确保即使发生错误(如 404 或 500),HSTS 头也会发送。
- HTTP 重定向:建议在另一个监听 80 端口的 server 块中配置重定向: server { listen 80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; }
Apache 配置
在 Apache 中,需要启用 mod_headers 模块,并在虚拟主机配置中添加 HSTS 头。
-
启用模块:
a2enmod headers
-
在虚拟主机配置文件中添加:
<VirtualHost :443> ServerName example.com # SSL 配置... # 添加 HSTS 头 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost> -
同样,建议在 HTTP 虚拟主机中配置重定向:
<VirtualHost :80> ServerName example.com RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </VirtualHost>
IIS (Internet Information Services) 配置
在 IIS 中,可以通过 web.config 文件或 IIS 管理器配置响应头。
通过 web.config 配置:
<configuration> <system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" /> </customHeaders> </httpProtocol> </system.webServer> </configuration>
通过 IIS 管理器:
- 选择站点,双击“HTTP 响应标头”。
- 点击右侧的“添加”。
- 名称:Strict-Transport-Security,值:max-age=31536000; includeSubDomains。
启用 HSTS 预加载(Preload)
HSTS 预加载列表是浏览器内置的一个列表,包含已知支持 HSTS 的域名,如果域名在预加载列表中,浏览器在首次访问该域名(甚至在没有网络缓存的情况下)也会强制使用 HTTPS,从而彻底消除首次访问时的 HTTP 跳转风险。

启用预加载的步骤:
-
满足条件:
- 域名必须仅通过 HTTPS 提供服务。
- 必须包含 preload 参数在 HSTS 头中。
- max-age 至少为 31536000 秒(1年)。
- 必须包含 includeSubDomains。
- 域名不能包含任何子域名指向非 HTTPS 服务。
-
提交审核:
- 访问 Chromium HSTS Preload List Submission。
- 输入您的域名。
- 系统会自动检查您的配置是否符合预加载要求。
- 如果检查通过,点击“Submit”提交。
-
等待审核:
- 审核过程可能需要几天到几周时间。
- 审核通过后,您的域名将被添加到 Chrome、Firefox、Safari 等主流浏览器的预加载列表中。
注意:一旦域名被加入预加载列表,无法轻易移除,如果未来需要关闭 HTTPS 或更改配置,可能会造成严重的访问问题,在提交预加载前,请确保您的 HTTPS 基础设施稳定且长期可用。
验证与测试
配置完成后,务必验证 HSTS 是否生效。

-
使用浏览器开发者工具:
- 打开浏览器开发者工具(F12)。
- 刷新页面,进入“网络”(Network)标签。
- 点击任意一个请求,查看“响应头”(Response Headers)。
- 检查是否存在 Strict-Transport-Security 头,并确认其值正确。
-
使用在线工具:
- SSL Labs:进行全面的安全扫描,查看 HSTS 状态。
- HSTS Preload Check:检查是否已加入预加载列表。
-
命令行测试:
curl -I https://example.com查看输出中是否包含 Strict-Transport-Security 头。
常见问题与注意事项
- 首次访问风险:如果用户第一次访问您的网站,浏览器尚未收到 HSTS 头,此时仍可能发生 SSL 剥离攻破,这就是为什么预加载列表如此重要。
- 子域名管理:如果使用了 includeSubDomains,所有子域名也必须支持 HTTPS,如果某个子域名暂时无法提供 HTTPS,请勿在主域名启用 includeSubDomains,否则该子域名将无法通过 HTTPS 访问。
- 缓存时间:max-age 设置得越长,用户设备缓存的 HSTS 策略越久,如果未来需要紧急关闭 HTTPS 或更换证书,用户可能需要等待 max-age 过期才能重新通过 HTTP 访问,或者需要手动清除浏览器缓存。
相关问题与解答
问题 1:启用 HSTS 后,如果我的 SSL 证书过期了,用户还能访问网站吗?
解答:
不能,启用 HSTS 后,浏览器会强制使用 HTTPS 连接,并且会缓存 HSTS 策略,SSL 证书过期或无效,浏览器将拒绝连接,并显示严重的安全警告,由于 HSTS 的存在,用户无法通过简单的“忽略警告”或切换到 HTTP 来绕过此限制,在启用 HSTS 之前,务必确保 SSL 证书的自动续期机制可靠,并密切监控证书有效期。
问题 2:HSTS 预加载列表中的域名可以随意移除吗?
解答:
不可以随意移除,一旦域名被加入浏览器的 HSTS 预加载列表,该策略将被硬编码在浏览器中,即使您从服务器端移除了 HSTS 头,浏览器仍然会强制使用 HTTPS,要移除域名,您需要通过官方渠道(如 Chromium 的 HSTS 预加载提交页面)申请移除,但这个过程非常缓慢且复杂,可能需要数月时间,如果域名在预加载列表中但不再支持 HTTPS,可能会导致大量用户无法访问您的网站,在提交预加载前,必须慎重考虑。