HTTP 严格传输安全(HSTS)是一项安全特性,它强制浏览器仅通过安全的 HTTPS 连接访问网站。该特性通过名为 Strict-Transport-Security 的 HTTP 响应头实现。HSTS 在 RFC 6797 中定义,可保护网站免受多种安全威胁,包括中间人(MITM)攻击与 SSL 剥离攻击,其手段是强制使用安全连接。每当 Web 服务器在 HTTPS 响应中加入该响应头,它便指示浏览器在指定时间内仅使用 HTTPS 加载网站。

HSTS 可防止降级攻击的风险——攻击者试图强迫用户通过 HTTP 而非 HTTPS 连接。它与互联网工程指导小组(IESG)等机构维护的更广泛互联网安全指南保持一致,并保护密码或支付信息等重要数据在传输过程中免遭拦截。HSTS 响应头包含两个指令:max-age,用于定义浏览器强制通过该策略仅以 HTTPS 加载网站的时间(以秒为单位);includeSubDomains,一个可选指令,用于将 HSTS 策略应用到网站的所有子域名。

为何要在电商网站上实施 HSTS?

HSTS 可缓解多种可能将网站与用户暴露于攻击之下的安全漏洞与威胁。通过强制仅使用 HTTPS 连接,它增强了网站安全性并提升了用户信任。以下是 HSTS 有助于防范的几类关键威胁:

防止 SSL 剥离:攻击者拦截并将 HTTPS 连接降级为 HTTP,诱骗用户通过未加密通道发送敏感数据。一旦浏览器收到 HSTS 响应头,它会自动将未来所有 HTTP 请求升级为 HTTPS,在 max-age 设置的有效期内阻断 SSL 剥离攻击。

消除浏览器安全警告:它消除了安全警告,提升信任,并鼓励用户在网站上自信地交互,尤其是在注册、登录与购物等敏感操作时。通过强制 HTTPS,HSTS 确保用户凭据与支付信息免遭拦截或篡改。

修复非安全内容:混合内容(在 HTTPS 页面上加载 HTTP 元素)会削弱加密并暴露用户于攻击之下。HSTS 屏蔽所有 HTTP 内容,确保网站及其资源(如图片、脚本、样式表)均通过 HTTPS 安全加载。

HTTP 严格传输安全(HSTS)的工作原理

当你在浏览器中手动输入 www.example.com 时,默认会以 HTTP(不安全版本)打开,除非你特意输入 HTTPS,或网站自动将你重定向到安全连接。如果站点未进行 HSTS 预加载,服务器首先会发出 301 重定向切换到 HTTPS;一旦通过 HTTPS 访问站点,浏览器收到 HSTS 响应头,便会在后续访问中强制使用 HTTPS。

浏览器通过 HTTPS 连接后,服务器发送如下 HSTS 响应头:Strict-Transport-Security: max-age=31536000; includeSubDomains; preload。该响应头指示浏览器在未来 31,536,000 秒(即 1 年)内,对所有网站及子域名请求使用 HTTPS 协议。当浏览器检测到 HTTP 链接时,会立即将连接切换为 HTTPS;若 HTTPS 不可用,HSTS 会完全阻止访问,防止任何不安全的 HTTP 回退。

没有 HSTS 时,浏览器可能允许用户绕过针对无效、过期或自签名证书的告警;而有了 HSTS,浏览器会严格执行规则,不留任何例外。如果出现 TLS/SSL 证书问题,连接会被切断,除非将该站点从浏览器的 HSTS 列表中移除,否则用户无法继续。简言之,HSTS 通过 HTTPS 验证与站点的每一次交互,降低意外 HTTP 连接或协议降级攻击的风险。它是一款强大的安全响应头工具,但配置错误可能将用户锁在门外,因此谨慎设置至关重要。

HTTP Strict-Transport-Security 响应头仅适用于发送它的域名。例如,若某子域名发送该响应头,除非主域名也包含 HSTS 响应头,否则它不会自动应用到 yourdomain.com。因此,为获得完整安全,主域名(如 yourdomain.com)也应接收带有 includeSubDomains 指令的 HSTS 响应头。

实施 HSTS 带来的关键安全收益

部分或完全没有 SSL、混用非安全与安全内容的网站极易遭受安全威胁。采用 HSTS 不仅有助于安全,还能通过以下方式提供一道无形屏障,防范因 SSL 安装疏漏引发的攻击:

将所有链接从 HTTP 转为 HTTPS:"includeSubDomains"指令可保护指向网站的所有浏览器请求(含子域名)。这一特性解决了因 SSL 部分启用及混合内容(某些脚本与图片使用 HTTP 链接)所引发的问题。

废除不安全的连接:许多用户习惯忽略安全警告。有了 HSTS,即便用户无视警告,通信也会自动终止,从而缩小潜在攻击的范围。

对"安全环境"施加限制:仅以安全模式提供网站,从而增强网站所有者的信心。

防御 Cookie 强制攻击:Cookie 强制攻击是一种 MITM 攻击,而 HSTS 的"includeSubDomains"模式可保护浏览器免受此类攻击。

转换不安全的 URL 引用:强制将任何 URL 中的 HTTP 替换为 HTTPS。如果用户或脚本误引用了 HTTP 链接,HSTS 会指示浏览器将其切换为 HTTPS,连接保持加密与安全,并避免可能暴露敏感数据的无意协议降级。

在 Web 服务器上实施 HSTS 的步骤

我们已讨论 HSTS 解决的问题、工作原理与收益,下面介绍在 Web 服务器上实施 HSTS 的步骤,共五步。

第 1 步:使用 SSL 证书将网站从 HTTP 迁移到 HTTPS。配置 HSTS 之前,请确保网站完全运行在 HTTPS 之上:从知名证书颁发机构获取 SSL/TLS 证书;签发后在 Web 服务器上安装所购 SSL 证书;将服务器配置为通过 HTTPS 重定向流量;确保内部链接全部使用 HTTPS;最后,确认脚本、图片等外部资源也都通过 HTTPS 加载。

第 2 步:在 Apache、Nginx 与 IIS 服务器上添加 HSTS 响应头。先以较短的 max-age 值(如 max-age=300,即 5 分钟)测试配置。

方法 1(Apache 服务器):在 Web 服务器配置或 .htaccess 文件中添加:Header always set Strict-Transport-Security "max-age=300; includeSubDomains; preload"。

方法 2(Nginx 服务器):在 Nginx 配置的 server 块中添加:add_header Strict-Transport-Security "max-age=300; includeSubDomains; preload" always;。

方法 3(IIS 服务器):在 IIS 服务器的 web.config 文件中添加:

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Strict-Transport-Security" value="max-age=300; includeSubDomains; preload"/>
    </customHeaders>
  </httpProtocol>
</system.webServer>

第 3 步:测试 HSTS 策略实施。添加响应头后需测试是否生效:使用可用在线工具(如 OWSAP.org)验证 HSTS 响应头是否正确工作;或使用浏览器开发者工具——在 Google Chrome 或 Mozilla Firefox 中访问站点,按 F12 打开开发者工具,定位到"Network"标签,刷新页面并选择初始请求(即你的域名),在"Headers"部分找到 Strict-Transport-Security 响应头确认已发送。测试 HSTS 强制:尝试用 http:// 打开网站,确认其自动重定向到 https://;若包含 includeSubDomains 指令,请确认子域名同样安全。

第 4 步:增大 max-age 值。用较短的 max-age 确认 HSTS 实施正确后,可将值提高到更长的时长,例如一年(max-age=31536000)。

方法 1(Apache):Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"。

方法 2(Nginx):add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;。

方法 3(IIS):

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload"/>
    </customHeaders>
  </httpProtocol>
</system.webServer>

第 5 步:进行 HSTS 预加载。HSTS 预加载如同额外的安全层,它将你的域名纳入 HSTS 启用网站列表并硬编码进浏览器。预加载网站需注意:确保 HSTS 响应头包含 preload 指令;访问 HSTS 预加载列表提交网站;输入你的网站并按提交流程操作。注意:预加载虽是强力的安全措施,但难以撤销,因此在提交网站前,请确认它已为长期的仅 HTTPS 访问做好充分准备。

实施 HSTS 响应头时应遵循的最佳实践

以下是一些在实施 HSTS 时应考虑并践行的要点:从较低的 max-age 值起步——初始使用较低值如 max-age=300,确认一切正常后再提高,可防止访客因配置错误被锁在门外;谨慎使用 includeSubDomains——启用前请确保所有子域名已准备好使用 HTTPS;为顶级域名部署策略——HSTS 主机应在其顶级域名声明策略,用于预加载的有效 HSTS 响应头为:Strict-Transport-Security: max-age=31536000; includeSubdomains; preload;定期监控——定期监控 HTTPS 配置,确保证书有效且安装正确;为父域名实施策略——对 https://domain.gov 而非 https://www.domain.gov 应用策略,可确保父域名的 HSTS 设置到位,保护用户免受 MITM 攻击者的 Cookie 注入尝试。

HSTS 挑战及其解决方案

许多人会问"HTTP 严格传输安全(HSTS)有没有问题?"大多数情况下没有问题,但有时你可能会遇到特定挑战,同时也存在相应解决方案:

混合内容问题——挑战:部分 URL 可能通过 HTTP 加载。解决方案:在响应头中使用 CSP(内容安全策略),它可检测并报告任何混合内容。

证书过期——挑战:过期的 SSL 证书可能因 HSTS 策略将站点用户锁在门外。解决方案:监控 SSL 证书到期时间,并在到期前实施自动续期以防中断。

开发与测试环境——挑战:实施 HSTS 后,使用不含 HTTPS 的开发环境会变得复杂。解决方案:为预发布与开发保留独立域名,以便关闭 HSTS。

反向代理的复杂性——挑战:HSTS 响应头可能无法从某些反向代理设置中正确传播。解决方案:确认你的反向代理已配置为正确管理 HSTS 响应头。

结论

HTTP 严格传输安全(HSTS)是一项重要技术,用于在网站上落实 HTTPS 连接,使站点访客与网站免受网络威胁。通过使用 Strict-Transport-Security 响应头,HSTS 在保证持续加密的同时,防范中间人等攻击。实施 HSTS 需要配置与规划,但仍值得推荐,因为它提供了强健的安全性与更高的信任度。