当前位置:首页 > 云服务器 > 正文

如何搭建HTTP严格传输安全协议?HSTS配置教程

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 头。

  1. 启用模块:

    如何搭建HTTP严格传输安全协议?HSTS配置教程 第1张

    a2enmod headers
  2. 在虚拟主机配置文件中添加:

    <VirtualHost :443> ServerName example.com # SSL 配置... # 添加 HSTS 头 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost>
  3. 同样,建议在 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 管理器:

  1. 选择站点,双击“HTTP 响应标头”。
  2. 点击右侧的“添加”。
  3. 名称:Strict-Transport-Security,值:max-age=31536000; includeSubDomains。

启用 HSTS 预加载(Preload)

HSTS 预加载列表是浏览器内置的一个列表,包含已知支持 HSTS 的域名,如果域名在预加载列表中,浏览器在首次访问该域名(甚至在没有网络缓存的情况下)也会强制使用 HTTPS,从而彻底消除首次访问时的 HTTP 跳转风险。

如何搭建HTTP严格传输安全协议?HSTS配置教程 第2张

启用预加载的步骤:

  1. 满足条件

    • 域名必须仅通过 HTTPS 提供服务。
    • 必须包含 preload 参数在 HSTS 头中。
    • max-age 至少为 31536000 秒(1年)。
    • 必须包含 includeSubDomains。
    • 域名不能包含任何子域名指向非 HTTPS 服务。
  2. 提交审核

  3. 等待审核

    • 审核过程可能需要几天到几周时间。
    • 审核通过后,您的域名将被添加到 Chrome、Firefox、Safari 等主流浏览器的预加载列表中。

注意:一旦域名被加入预加载列表,无法轻易移除,如果未来需要关闭 HTTPS 或更改配置,可能会造成严重的访问问题,在提交预加载前,请确保您的 HTTPS 基础设施稳定且长期可用。

验证与测试

配置完成后,务必验证 HSTS 是否生效。

如何搭建HTTP严格传输安全协议?HSTS配置教程 第3张

  • 使用浏览器开发者工具

    1. 打开浏览器开发者工具(F12)。
    2. 刷新页面,进入“网络”(Network)标签。
    3. 点击任意一个请求,查看“响应头”(Response Headers)。
    4. 检查是否存在 Strict-Transport-Security 头,并确认其值正确。
  • 使用在线工具

  • 命令行测试

    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,可能会导致大量用户无法访问您的网站,在提交预加载前,必须慎重考虑。

0