如何配置使用 HTTP 严格传输安全(HSTS)

本文介绍HTTP严格传输安全(HSTS)的功能及其实现方法。HSTS能有效防御中间人攻击和SSL剥离攻击,确保浏览器始终使用HTTPS访问指定站点。文章详细讲解了在Apache2、Nginx和Lighttpd等主流Web服务器上启用HSTS的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP 严格传输安全(HSTS)是一种安全功能,web 服务器通过它来告诉浏览器仅用 HTTPS 来与之通讯,而不是使用 HTTP。本文会说明如何在 Apache2、Nginx 和 Lighttpd 上如何启用 HSTS。在主流的 web 服务器上测试通过: Nginx 1.1.19、 Lighttpd 1.4.28 和 Apache 2.2.22 ,环境为 Ubuntu 12.04、 Debian 6 & 7 和 CentOS 6,只需要调整部分参数就可以工作在其它的发行版上。

什么是 HTTP 严格传输安全?

引用自 Mozilla Developer Network

如果一个 web 服务器支持 HTTP 访问,并将其重定向到 HTTPS 访问的话,那么访问者在重定向前的初始会话是非加密的。举个例子,比如访问者输入 http://www.foo.com/ 或直接输入 foo.com 时。

这就给了中间人攻击的一个机会,重定向可能会被破坏,从而定向到一个恶意站点而不是应该访问的加密页面。

HTTP 严格传输安全(HSTS)功能使 Web 服务器告知浏览器绝不使用 HTTP 访问,在浏览器端自动将所有到该站点的 HTTP 访问替换为 HTTPS 访问。

以下引自维基百科

HSTS 可以用来抵御 SSL 剥离攻击。SSL 剥离攻击是中间人攻击的一种,由 Moxie Marlinspike 于2009年发明。他在当年的黑帽大会上发表的题为 “New Tricks For Defeating SSL In Practice” 的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入https://,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有https://开头的链接为http://,达到阻止HTTPS的目的。

HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。

另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。

场景举例:

当你通过一个无线路由器的免费 WiFi 访问你的网银时,很不幸的,这个免费 WiFi 也许就是由黑客的笔记本所提供的,他们会劫持你的原始请求,并将其重定向到克隆的网银站点,然后,你的所有的隐私数据都曝光在黑客眼下。

严格传输安全可以解决这个问题。如果你之前使用 HTTPS 访问过你的网银,而且网银的站点支持 HSTS,那么你的浏览器就知道应该只使用 HTTPS,无论你是否输入了 HTTPS。这样就防范了中间人劫持攻击。

注意,如果你之前没有使用 HTTPS 访问过该站点,那么 HSTS 是不奏效的。网站需要通过 HTTPS 协议告诉你的浏览器它支持 HSTS。

服务器开启 HSTS 的方法是,当客户端通过HTTPS发出请求时,在服务器返回的 HTTP 响应头中包含 Strict-Transport-Security 字段。非加密传输时设置的HSTS字段无效。

在 Apache2 中设置 HSTS

编辑你的 apache 配置文件(如 /etc/apache2/sites-enabled/website.conf 和 /etc/apache2/httpd.conf ),并加以下行到你的 HTTPS VirtualHost:

 
  1. # Optionally load the headers module:
  2. LoadModule headers_module modules/mod_headers.so
  3. <VirtualHost 67.89.123.45:443>
  4. Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
  5. </VirtualHost>

现在你的 web 站点在每次访问时都会发送该请求头,失效时间是两年(秒数)。这个失效时间每次都会设置为两年后,所以,明天你访问时,它会设置为明天的两年后。

你只能在 HTTPS 虚拟机中设置这个头,而不能设置在 HTTP 虚拟机中。

要将你的访问者重定向到对应 HTTPS 站点,可使用如下设置:

 
  1. <VirtualHost *:80>
  2. [...]
  3. ServerName example.com
  4. Redirect permanent / https://example.com/
  5. </VirtualHost>

如果仅仅是做重定向的话,甚至不需要设置 DocumentRoot。

你也可以使用 mod_rewrite 来做重定向,但是上述的方式更简单更安全。不过,mod_rewrite 可以重定向页面到对应的 HTTPS 页面,而上述配置则只重定向到“/”:

 
  1. <VirtualHost *:80>
  2. [...]
  3. <IfModule mod_rewrite.c>
  4. RewriteEngine On
  5. RewriteCond %{HTTPS} off
  6. RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
  7. </IfModule>
  8. </VirtualHost>

不要忘记重启 Apache。

Lighttpd

对于 lighttpd 来说很简单,将下述配置增加到你的 Lighttpd 配置文件(例如:/etc/lighttpd/lighttpd.conf):

 
  1. server.modules += ( "mod_setenv" )
  2. $HTTP["scheme"] == "https" {
  3. setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
  4. }

重启 Lighttpd。失效时间也是两年。

Nginx

Nginx 甚至更简单,将下述行添加到你的 HTTPS 配置的 server 块中:

 
  1. add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

不要忘记重启 Nginx。

<think>好的,我需要帮助用户了解如何启用HSTS策略。首先,我应该回忆HSTS的基本概念,确认它是什么以及为什么重要。根据引用内容,HSTS通过响应头Strict-Transport-Security强制浏览器使用HTTPS,避免中间人攻击。这一点在引用1和4中都有提到。 接下来,用户想知道如何启用HSTS。根据之前的引用,不同的服务器配置方法不同。比如,引用2提到了Apache配置,引用3是Tomcat的,而引用4是Nginx的。我需要整理这些信息,分步骤说明不同服务器的配置方法。首先,Apache配置需要修改配置文件,添加Header setStrict-Transport-Security字段,并包含max-age、includeSubDomains和preload参数。Tomcat则需要修改web.xml,添加filter和header配置。Nginx则使用add_header指令。这些步骤需要具体说明,并给出代码示例,如引用中的代码块。另外,includeSubDomains参数的作用在引用1和4中提到,它表示包含所有子域名,这也是配置时需要注意的选项。preload参数涉及提交到浏览器预加载列表,需要用户明确是否添加。 然后,用户可能需要验证配置是否生效,所以需要说明如何检查响应头,比如使用浏览器开发者工具或curl命令。同时,要提醒注意事项,比如必须启用HTTPS,否则HSTS无效,这在引用2中提到过。最后,生成相关问题,帮助用户深入理解,比如优化HSTS配置、解决证书错误、与其它安全头配合使用等。这些问题需要基于现有引用内容,比如引用4提到了X-Frame-Options,可以关联起来。 需要确保回答结构清晰,分步骤说明,每个服务器配置单独列出,语法正确,使用中文,并且引用正确来源。同时,检查是否有遗漏的服务器类型,比如IIS或其他,但根据现有引用,可能只覆盖Apache、Tomcat、Nginx,所以可以专注于这些。</think>### 如何启用HTTP严格传输安全HSTS)策略? HTTP严格传输安全HSTS)是一种通过响应头强制浏览器仅通过HTTPS与服务器通信的安全策略。以下是具体配置方法: --- #### 一、核心配置步骤(通用) 1. **确保服务器已启用HTTPS** HSTS仅在HTTPS连接中生效,未加密的HTTP响应头设置无效[^2]。 2. **添加`Strict-Transport-Security`响应头** 包含以下参数: - `max-age=<秒>`:HSTS策略生效时间(建议至少`63072000`,即2年)[^4]。 - `includeSubDomains`(可选):将策略扩展到所有子域名[^1]。 - `preload`(可选):申请加入浏览器预加载列表[^4]。 --- #### 二、具体服务器配置示例 **1. Apache服务器** 修改`.htaccess`或虚拟主机配置文件: ```apache <IfModule mod_headers.c> Header set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS </IfModule> ``` 重启Apache生效[^2]。 **2. Nginx服务器** 在`server`块中添加: ```nginx add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; ``` 重载配置:`nginx -s reload`[^4]。 **3. Tomcat服务器** 修改`web.xml`,添加过滤器配置: ```xml <filter> <filter-name>HSTSFilter</filter-name> <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> <init-param> <param-name>hstsEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>hstsMaxAgeSeconds</param-name> <param-value>63072000</param-value> </init-param> <init-param> <param-name>hstsIncludeSubDomains</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>HSTSFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 重启Tomcat生效[^3]。 --- #### 三、验证配置是否生效 1. **浏览器开发者工具** 在HTTPS响应头中检查是否包含`Strict-Transport-Security`字段。 2. **命令行工具** 使用`curl`命令: ```bash curl -I https://你的域名 ``` --- #### 四、注意事项 - **首次启用需谨慎**:若未完全支持HTTPS,可能导致用户无法访问。 - **预加载列表提交**:添加`preload`后需通过[hstspreload.org](https://hstspreload.org)提交域名[^4]。 - **与其他安全头配合**:如`X-Frame-Options`(引用4中示例)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值