zhaobinglong / myBlog

https://zhaobinglong.github.io/myBlog/
MIT License
7 stars 0 forks source link

http协议之hsts #75

Open zhaobinglong opened 3 years ago

zhaobinglong commented 3 years ago

背景

但是当网站传输协议从 HTTP 到 HTTPS 之后,数据传输真的安全了吗?

由于用户习惯,通常准备访问某个网站时,在浏览器中只会输入一个域名,而不会在域名前面加上 http:// 或者 https://,而是由浏览器自动填充,当前所有浏览器默认填充的都是http://。一般情况网站管理员会采用了 301/302 跳转的方式由 HTTP 跳转到 HTTPS,但是这个过程总使用到 HTTP 因此容易发生劫持,受到第三方的攻击。

HSTS(HTTP 严格安全传输)

HSTS是国际互联网工程组织 IETF 正在推行一种新的 Web 安全协议,网站采用 HSTS 后,用户访问时无需手动在地址栏中输入 HTTPS,浏览器会自动采用 HTTPS 访问网站地址,从而保证用户始终访问到网站的加密链接,保护数据传输安全。

原理

HSTS 主要是通过服务器发送响应头的方式来控制浏览器操作:

  1. 首先在服务器响应头中添加 HSTS 响应头:
    Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
    // 此响应头只有在 https 访问返回时才生效,其中[ ]中的参数表示可选;
  2. 设置 max-age 参数,时间设置不宜过长,建议设置时间为 6 个月;
  3. 当用户下次使用 HTTP 访问,客户端就会进行内部跳转,并且能够看到 307 Redirect Internel 的响应码;
  4. 网站服务器变成了 HTTPS 访问源服务器。

优点

开启 HSTS 后网站可以有效防范中间人的攻击,同时也省去网站 301/302 跳转花费的时间,大大提升安全系数和用户体验。 image

缺点

第一次访问网站的客户端,HSTS 并不工作

HSTS预载入列表

如果一个用户从来没有以HTTPS方式访问过我们的网站呢,那显然就没有机会得到HSTS 响应头,从而还是有可能以HTTP的方式进行首次访问——虽然我们已经做了很多自动和强制的引导,但是总还稍有缺憾?所以,追求完美人们,又提出了一个HSTS预载入列表preload list(友情提示,请自备梯子)。

谷歌在浏览器安全方面总是走在前面,因此它维护了一个预载入列表给Chrome 使用,这个列表会硬编码到 Chrome 浏览器中。后来,Firefox、Safari、 IE 11 和 Edge 一想,得了,咱也别自己弄一个了,都采用这个列表吧。所以,各大浏览器都支持同一个列表了。如果要想把自己的域名加进这个列表,需要满足以下条件:

查看网站是否开启hsts

chrome://net-internals/#hsts

// 向chrome提交hsts域名
https://hstspreload.appspot.com/

Nginx开启hsts

server {
    listen 443 ssl;
    server_name domain.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    location / {
    }
}

参考

https://www.cnblogs.com/upyun/p/7447977.html https://www.wosign.com/News/HTTPS-HSTS.htm