标签 hsts 下的文章

HSTS SSL Protocol

两年前我发布了关于 Nginx 配置加入 HSTS 相关文章,也一直没实行加入 HSTS 预加载列表,今天闲的没事干给网站做各种测试,发现用360浏览器测试网站强制访问 http 时发现右下角有广告出现,很明显 http 已经被劫持而 https 没有被劫持,但是其它浏览器强制访问 http 却没有被劫持,直接申请加入 HSTS 移除后患。

在这里说一句:360 垃圾!

采用HSTS协议的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址(防http劫持)。

该协议将帮助网站采用全局加密,用户看到的就是该网站的安全版本。

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

比如,https://xxx 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:
在接下来的一年(即31536000秒)中,浏览器只要向xxx或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://xxx/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://xxx/ 发送请求。
在接下来的一年中,如果 xxx 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

Nginx 配置 HSTS

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

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

保存后重启 Nginx

开启了HSTS后,你部署SSL/TLS的服务检测得分就可能是A+以上了。

20181102083459.png

加入 HSTS Preload List

拥有合法的 SSL 证书;

将所有 HTTP 流量重定向到 HTTPS;

确保所有子域名都启用了 HTTPS;

输出 HSTS 响应头:

max-age 不能低于 18 周(10886400 秒);

必须指定 includeSubdomains 参数;

必须指定 preload 参数;

HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也在采用这个列表。

https://hstspreload.org/

测试HSTS是否生效

直接打开Chrome查看网络,就可以看到头部已经包含了HSTS信息了。

20181102091128.png

做好Http跳转Https

将 xxx.com 以及任意二级域名都要做好 Http 跳转到 Https。

加入HSTS Preload List

进入 hstspreload 官网,输入你的域名,然后检测结果会告诉是否符合加入HSTS Preload List,没有问题的话勾选确定。

提交之后会提示您正在等待提交到预加载列表:

20181102083921.png

由于人工审核机制,需要1至2月时间才能申请成功;

本以为需要一个多月,刚好半个月就申请通过了HSTS;

20181201181510.png

这样,就可以关闭服务器 80 端口,不需要设置重定向,彻底默认 https 协议了。

Nginx启用新型HSTS安全协议

1440810884828.jpg

HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式。

当用户已经安全的登录开启过htst功能的网站 (支持hsts功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持htst的浏览器(比如chrome. firefox)会自动将这个域名加入到HSTS列表,下次即使用户使用http访问这个网站,支持htst功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到hsts缓存中,然后才会在发送请求前将http内部转换成https),而不是先发送http,然后重定向到https,这样就能避免中途的302重定向URL被篡改。‍‍进一步提高通信的安全性。‍‍‍

HSTS preload list是什么?

HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。

如何加入HSTS preload list?

加入HSTS preload list不但不麻烦,而且Chrome也鼓励HTTPS网站能够主动加入。申请的方法和需要满足的条件在https://hstspreload.appspot.com网站上都有具体说明。

我将加入HSTS preload list的条件摘录如下:

有效的证书(如果使用SHA-1证书,必须是2016年前就会过期的);

将所有HTTP流量重定向到HTTPS;

确保所有子域名启用HTTPS,特别是www子域名

同时输出的HSTS响应头部需要满足以下条件:

max-age至少需要18周,10886400秒

必须指定includeSubdomains参数

必须支持preload参数

Nginx配置:

HSTS preload list响应头:

在server模块中加入.

add_header Strict-Transport-Security “max-age=31536000; includeSubDomains;preload”;

新增一个server模块.

server
{
listen 80;
server_name suming.org www.suming.org;
rewrite ^/(.*) https://suming.org/$1 permanent;
}

达到以上条件之后前往:https://hstspreload.appspot.com 进行申请加入HSTS.(需反代访问)