Total Pageviews

Sunday, 6 September 2015

Chrome的 HTTPS 警告

最近如果使用Chrome访问国内的很多网站的时候,比如exmail.qq.com, 你可能会注意到这样一个对话框:


呃, 这是个什么意思?

访问链接没有私密性 (not private)

陈老师:我上个邮箱,连私密性都没有了,那里面的照片应该怎么办,以前修电脑没有私密性,现在连上网都没有私密性,难道我又要上头条了?

等等,好像有点不对, 网页私密性到底是个啥,为啥会提醒我这个问题,我不是已经输了密码登录了嘛。。

事情要从头说起。

HTTPS (安全超文本协议)

1997 年 CERN发明HTTP 协议并用于万维网的时候,仅仅是为了在学术界内部做一个共享数据的平台, 并没有想到太多传输中的安全性。毕竟当年网络规模非常小,而计算机以及昂贵的网络设备并不是每个人都可以买得起的。

他们当然没有料到之后万维网居然成了一个信息传递的通用平台,一帮人甚至丧心病狂的在上面做起了Web电子邮箱,网络银行一类服务。这类服务队安全性和私密性要求都非常严格, 因为基本上没有人希望自己的银行密码,私人的邮件在传输中被第三方看到。

于是问题就来了, HTTP 是明文传输的。 HTTP倒是支持密码认证,只是不巧的是,密码也是明文传的。

于是在当年网景一帮科学家,特别是 Dr. Taher Elgamal (号称SSL 之父)的努力下, HTTPS 横空出世。

HTTPS 里面,所有的传输的数据都是加密过的,于是第三方无法在数据的传输过程中获得任何有用的数据, 数据传输中的私密性自然得到了保证。

至少设计目的是这样子的…

HTTPS 并非是一个全新的协议,其实是 HTTP + SSL (安全套接字)或者是后来的 TLS (传输安全协议)。 SSL/TLS 工作在 HTTP 之下, 负责加密所有传输的数据。

说个题外话,当时不仅仅是 HTTP, 众多的互联网上层协议(应用层协议,STMP 电子邮件协议 一类的)大多都是明文传输的。 SSL/TLS 由于是工作在TCP层和应用层之间,它可以加密任何应用层协议,包括STMP一类。 从这个角度说来,网景对互联网的贡献其实是非常深远的。

HTTPS 使用非对称算法交换密钥,这个也是一个非常精巧的算法,有兴趣的同学可以在这里了解下。

Public-key_cryptography

号称是20世纪最重要的算法之一。

不过 HTTPS 除了解决加密问题以外,还需要还解决另外一个问题: 网站真实身份鉴别。

比如,如果你上 https://www.cmbchina.com, 你怎么知道你上的就是招商银行网站而不是一个做得和招商银行一模一样的钓鱼网站呢?

这个其实和现实生活中如何鉴定一个长的像警察并且突然站到你面前要你交罚款的人是否是真正的人民警察是一个场景。


“警官证可以给我看看吗,谢谢”

HTTPS 用的是同一种方法,它要求每一个使用这个协议的网站从专业的第三方机构申请一个数字证书,数字证书中包括网站的域名,所有者等的, (当然也包括公钥,协议细节太多,这里就不展开了)。

这个数字证书其实就相当于现实中的警官证。

在访问这个网站的时候浏览器会对数字证书做一次检查,而这个对话框,就是检查的结果。

我们来看看这个对话框是个什么鬼。

整个对话框其实包含了2段内容

第一段是

The identity of this website has been verified by GeoTrust SSL CA - G2 but does not have public audit records.

The site is using outdated security settings that may prevent future versions of Chrome from being able to safely access it.

刚才有提到数字证书是由专业机构颁发的,不过

- 专业机构就没有坏人了嘛。
- 证书就不会被人偷吗。
- 专业机构被骗了怎么办。

事实上,荷兰专业机构(DigiNotar)甚至被入侵过一次, 丢了好几百个证书,你可以自行脑补一下有人潜入公安部自己办了几百个警官证然后流入民间是一个多么壮观的场景。[1]

于是,IETF在2013年启动了一个叫做certificate-transparency的开源项目,把所有已知的合法证书做了一个白名单,浏览器在验证证书的时候同时也会去查看这个证书是不是在白名单里面。 如果不在的话,就会告知用户这个证书找不到记录,于是,有可能是假或者是被盗的证书。[2]

但是,这里有一个致命的问题:

到目前为止,这个还只是一个试验性项目,而这个世界上那么多的网站, 你白名单得过来嘛。

谷歌其实自己也知道目前白名单的覆盖很差,一般找不到记录,并不会加上确切的警告标示。所以,目前你可以忽略它。

关键在第二个:

This site uses a weak security configuration (SHA-1 signatures), so your connection may not be private.

这个就比较有意思了。

还是那个警官证的问题。 要搞一个警官证除了去偷/骗/潜入公安部自己做一个真的以外, 你还可以, 呃..做个假的嘛。

对于数字证书来说,最重要的鉴别真假的部分是数字签名,而鉴于数字证书一般不小,不可能对每个字节都签一次名,一般来说是对数字证书的一个哈希值进行签名。

什么,你不知道哈希值是什么。

打个比方,如果你是一个数字证书, 那你的照片就是你的哈希值。

它包含下面几个条件:

- 通过合适的手段,可以从你产生你的照片, 但是没法从照片产生你。(单向的)
- 只有你可以精确的产生你的照片,别人都不行。(唯一的)

所以如果想检查一个人的警官证,只需要看看照片能不能对上人(哈希值符合), 照片上面的骑缝章对不对(数字签名)。 而这个骑缝章只需要盖在照片(数字签名)上,不需要盖在警官兄的脸(本体)上[3]。

数字证书中,SHA-1就是一种常见的哈希算法。 可以像照相机一样,给你的数字证书生成一个唯一值(照片)。

只是这个算法有一个问题。 这个算法这个函数由于设计时间早,强度太差,导致有可能用两个不同的数字证书可能会生成同样一个值。

这个就像如果你有一个照身份照的照相机,不过这个神奇的照相机拍的太模糊,以致于通过特殊的设定,可以用另外一个人照出和真实警官一模一样的照片。

如果你发现了这个设定,恭喜你, 你可以大规模的制作套牌警官证了。

这种现象在哈希函数中被称为是“碰撞”。

对于SHA-1 算法 如果要找到这个“特殊的设定”大概需要2的74次方个操作[4], 这个在SHA-1发明的时候是不可想象,不过其实在现在也是不可行的。只是按照现在计算机的发展速度 2018 年左右使用价格合适服务器集群理论上就可以破解[5]。

A collision attack is therefore well within the range of what an organized crime syndicate can practically budget by 2018, and a university research project by 2021.

于是,Chrome 认为使用sha-1的哈希函数都是潜在不安全的,于是会对所有使用SHA-1的网站证书提出警告,督促所有使用SHA-1的网站换为SHA-2。不过注意,仅仅是潜在不安全, 目前还没有可行可靠的SHA-1碰撞算法出现。

所以,这些网站暂时是安全的,不过也希望站长们多多提高安全意识,因为SHA-1已经非常接近可以被“破解”边缘。

详细的证书设置以去除这个警告的步骤在这里-
TOC-Deprecation-of-TLS-Features-Algorithms-in-Chrome:
https://www.chromium.org/Home/chromium-security/education/tls#TOC-Deprecation-of-TLS-Features-Algorithms-in-Chrome

你问我我怎么知道。欧朋Opera是Chromium安全组成员这种事情我会主动告诉你嘛。有兴趣可以去看看讨论组里面的撕逼贴, 截个屏放在这里:




[1] http://www.computerworld.com/article/2510856/security0/hackers-may-have-stolen-over-200-ssl-certificates.html
[2] http://tools.ietf.org/html/rfc6962
[3] 我知道这个比喻有非常多学术上的不严谨性,不过这个是我能找到最容易理解的比喻之一了。。
[4] http://marc-stevens.nl/research/papers/EC13-S.pdf 的论文指出,只需要2的61次方个操作即可完成
[5] https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html