越来越多的网站都已经开始或者实现了从HTTP到HTTPS的升级和跳转,这是一个网站安全发展的趋势,同时也因为市场上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

留言评论

登录 后留言