该如何构建好安全的HTTPS站点

安全设备/系统

160人已加入

描述

HSTS(HTTP Strict Transport Security,HTTP 严格传输安全),是一套由互联网工程任务组发布的互联网安全策略机制。网站可以通过配置 HSTS,来强制浏览器使用 HTTPS 与网站通信,保障网站更加安全。

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

比如,`https://example.com/`的响应头含有`Strict-Transport-Security: max-age=31536000; includeSubDomains`。

在接下来的一年(即31536000秒)中,浏览器只要向`example.com`或其子域名发送HTTP请求时,必须采用`HTTPS`来发起连接。比如,用户点击超链接或在地址栏输入 `http://www.example.com/` ,浏览器应当自动将 http 转写成 `https`,然后直接向 `https://www.example.com/` 发送请求。

在接下来的一年中,如果 `example.com` 服务器发送的`TLS`证书无效,用户不能忽略浏览器警告继续访问网站。如何进行配置?以 nginx 为例,我们在对应域名的 vhost 中增加响应头:server { .... add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";...}。

max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求。includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问。preload,可选参数,HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。

HSTS 可以很好地解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。

目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:

拥有合法的证书(如果使用 SHA-1 证书,过期时间必须早于 2016 年);将所有 HTTP 流量重定向到 HTTPS;确保所有子域名都启用了 HTTPS;输出 HSTS 响应头:max-age 不能低于 18 周(10886400 秒);必须指定 includeSubdomains 参数;必须指定 preload 参数;

但是,即便满足了上述所有条件,也不一定能进入 HSTS Preload List,更多信息可以看这里(https://hstspreload.org/)。通过 Chrome 的 chrome://net-internals/#hsts 工具,可以查询某个网站是否在 Preload List 之中,还可以手动把某个域名加到本机 Preload List。

对于 HSTS 以及 HSTS Preload List,我的建议是只要你不能确保永远提供 HTTPS 服务,就不要启用。因为一旦 HSTS 生效,你再想把网站重定向为 HTTP,之前的老用户会被无限重定向,唯一的办法是换新域名。如果确定要开启,点击https://hstspreload.org,输入你的域名,勾选协议,提交即可。提交成功后会给你返回成功的信息,不过你要保证你的配置比如是一直开启了,否则也会从列表中删除。

此外,我们要做到让HTTPS 网站更安全更快速,还应当做到以下几点:第一,密钥要足够的复杂,以rsa 密钥对为例,最好超过2048位;第二,ssl_ciphers 的合理配置,尽量抛弃那些已经被证明不安全的加密算法,使用较新的被证明无安全威胁的算法。第三,避免使用已经被证明不安全的加密协议,例如 SSLV2和SSLV3 ,而使用 TLSv1.2 TLSv1.3。

一般来说较新的协议都是针对上一个版本进行了很多的优化,比如TLS1.2和TLS1.3协议,可以看下这2个协议的加密过程,TLS1.2 协议中需要加密套件协商、密钥信息交换、ChangeCipherSpec 协议通告等过程,需要消耗 2-RTT 的握手时间,这也是造成 HTTPS 协议慢的一个重要原因之一。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分