越来越多的网站都已经开始或者实现了从HTTPHTTPS的升级和跳转,这是一个网站安全发展的趋势,同时也因为市场上SSL免费证书的充足,也进一步加快了普通网站实现 HTTPS 协议,但随之而来的安全性问题也出现了。

其中几乎所有的站长会开启强制 HTTPS 机制,也就是利用 301/302 对网站的 HTTP 请求全部跳转到 HTTPS,从而实现全站的 HTTPS 协议访问,但这显然不妥。所以这里子凡就要分享一下这个解决方法,那就是借助一个新的 WEB 安全协议:HSTS

HTTP Strict Transport Security

所有关于 HSTS 安全协议的全面介绍子凡前面已经单独用一篇文章《关于 HSTS 安全协议的全面详细解析》做了详细的分享,所以这里就不过多说明什么是 HSTS,HSTS 有什么用,推荐大家先去阅读一下。下面子凡就将主要分享 HSTS 配置及实用,包括Apache、Nginx、Lighttpd 以及 PHP 方式如何配置并启用 HSTS。

一、配置启用 HSTS

1. 在 Apache2 中配置 HSTS

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

1
2
3
4
5
6
# Apache需加载mod_header库,一般位于httpd.conf文件,搜索mod_headers并取消注释。(已加载可跳过)
LoadModule headers_module modules/mod_headers.so
 
#然后对应站点VirtualHost里面插入HSTS响应头信息

	Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

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

别忘了保存 Apache 配置文件,然后重启。

2. 在 Nginx 中配置 HSTS

Nginx 服务器中的配置最为简单,只需要编辑 Nginx 配置文件(如:/usr/local/nginx/conf/nginx.conf)将下面行添加到你的 HTTPS 配置的 server 块中即可:

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

网上看有些朋友直接添加在 server 块中无效的情况,或许可以试试直接插入到 location ~ *php 内:

1
2
3
location ~ [^/]\.php(/|$) {
	add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
}

配置保存后重启 Nginx 服务。

3. 在 Lighttpd 中配置 HSTS

对于 lighttpd 来说貌似也很简单,但子凡没有亲自测试过哈,将下述配置增加到你的 Lighttpd 配置文件(例如:/etc/lighttpd/lighttpd.conf):

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

编辑保存后记得重启一下最好咯!

4. 通用配置 HSTS 方法

如果你的是虚拟主机,不想或者不会修改配置文件,那么你可以尝试子凡这里提供的更简单的利用代码来新增相应头信息。语言能力有限,所以就只分享 php 的实现方法,其它网页语音自行研究咯,欢迎提供给子凡哈!

将以下代码添加到网站根目录 index.php 中即可:

1
header("Strict-Transport-Security: max-age=63072000; includeSubdomains; preload");

二、整站链接支持 HTTPS 协议

为了更好的实现整站 HTTPS 协议的访问,很多的站长可能就直接全部将 HTTP 协议强制跳转到了 HTTPS 协议,但是也不能排除很多任性和稀奇的人,想要网站同时支持 HTTP 与 HTTPS。

子凡也就不评论其中的好与坏,甚至之前泪雪博客也同时存在过 HTTP 和 HTTPS 共存的情况,但当时只是为了网站测试 SSL 证书以及网站从 HTTP 顺利平移到 HTTPS 的一个中转。目前也已经整站强制性实用 HTTPS 协议访问。

那么为了让网站良好的支持 HTTPS 以及对 HSTS 安全协议的完美支持,需要将网站的 HTTP 协议的绝对链接修改替换成 HTTPS 绝对链接或者相对链接。

例如:

1
<a href="https://zhangzifan.com">泪雪博客</a>

以上为 HTTP 协议的绝对链接,需要改成以下 HTTPS 协议的绝对链接或者相对链接:

1
2
3
4
// HTTPS 绝对链接
<a href="https://zhangzifan.com">泪雪博客</a>
// 相对链接
<a href="//zhangzifan.com">泪雪博客</a>

如果你的网站已经全面转向 HTTPS,建议使用 HTTPS 协议绝对链接;如果你的网站需要同时支持两种协议,那么请选择使用相对链接。

由于大家所使用的网站程序等都各不一样,子凡也没有办法提供具体的修改和替换方法,如果你使用的是 WordPress 程序,相关的代码已经在文章《WordPress 开启 HTTPS 协议,让站内链接支持 SSL》分享,欢迎大家移步查看即可。

三、HSTS preload list 提交

在《关于 HSTS 安全协议的全面详细解析》一文中就已经介绍了 HSTS,主要是为了解决 HTTP 请求 301/302 跳转到 HTTPS 这个过程可能被劫持的情况,而实际上就算加上 HSTS 响应头,用户请求的前半程依然是 HTTP 协议,所以这个时候我们就需要 HSTS preload list 了。

HSTS preload list 简单的说其实就是一个清单列表,将支持 HSTS 的网站全部加入一个 Preload 的列表,而支持 HSTS 协议的浏览器请求网站前会查询当前网站是否在这个列表中,如果是那么直接转换为 HTTPS 请求!从而解决前半程为 HTTP 的问题。这样说应该能理解咯

前面子凡已经分享了配置启用 HSTS 的几种方法和不同的服务器环境,那么下面子凡据需分享一下关于如何提交到 Preload 列表。

HSTS preload list 提交地址: https://hstspreload.org/ (可能需要免费科学上网方法

提示:从提交到批准,网站必须强制 301 跳转到 HTTPS,否则无法通过。完成审核后可取消 301 跳转。

审核时间不等,又快有慢,直到支持的浏览器完全生效可能更需要一些时间。所以如果提交了,几乎也就不用管了。

注意:加入 Preload 列表中的网站是不能轻易撤销的,域名可以删除,但是可能需要几个月甚至更长的时间才能通过 Chrome 更新来覆盖用户,而其它浏览器就更不确定了。

所以不要轻易的加入 HSTS preload list ,除非你可以确定整个网站可以长期支持 HTTPS。不然哪天你取消 SSL 证书后,用户浏览器依然通过 HTTPS 协议访问就不好了,当然你依然可以做 301 跳转。所以如果只是玩玩,子凡建议大家还是算了吧!

写在最后

从配置启用 HSTS,到提交 HSTS preload list ,子凡自认为还是写得比较详细了,只是最后大家要提交 HSTS preload list 就需要确定一下自己的网站是否能够长期保证使用 HTTPS 协议,否则可能带来不必要的问题。

除非注明,否则均为泪雪博客原创文章,转载请以链接形式标明本文地址

本文链接:https://zhangzifan.com/http-hsts.html

发表评论

  1. LiarOnce
    1楼
    LiarOnce 2年前 (2017-03-11)

    我自己也补充了几个,不方便发啊

    • 张子凡
      回复
      张子凡 2年前 (2017-03-11)
      回复 @LiarOnce :看到了,挺全面的
  2. essay代写
    2楼
    essay代写 2年前 (2017-03-06)

    SSL最近好像很火啊

    • 张子凡
      回复
      张子凡 2年前 (2017-03-07)
      回复 @essay代写 :是的,这个趋势越来越明显了
  3. 科学上网就选我
    3楼
    科学上网就选我 2年前 (2017-02-10)

    新技术要马上GET。。

  4. 来钱道
    4楼
    来钱道 2年前 (2017-02-06)

    这种安全是哪些方面的,不被攻击还是信息安全?

    • 张子凡
      回复
      张子凡 2年前 (2017-02-08)
      回复 @来钱道 :HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。
  5. 明月登楼的博客
    5楼
    明月登楼的博客 2年前 (2017-02-05)

    SSL还是可以考虑的!

    • 张子凡
      回复
      张子凡 2年前 (2017-02-08)
      回复 @明月登楼的博客 :是的,这也是趋势所在了