浏览器提示“证书错误”到底是什么意思?

我们在上网的时候会发现有些网址是https开头的,很多人都知道https代表着安全和加密,但有时候当我们访问https网址时,会遇到下面这样的证书错误:


卧槽这什么鬼?好像很多人在这里都会直接无视浏览器的警告,然后点“继续浏览此网站(不推荐)”,可是“不推荐”三个字这么大呢,还一个大大的红叉呢,怎么看都觉得挺不靠谱的。话说回来,“证书”到底是个什么东西呢,它是用来干什么的呢?

保卫信息安全的SSL/TLS

我们平时上网访问的http开头的网址都是不经过任何加密的,换句话说,你的浏览器和网站服务器之间的通讯是能够被任意窃听、劫持和篡改的,听上去很恐怖是吧?实际上这样的事事每天都在发生,只是其中绝大部分都是无关紧要的信息罢了。不过总有一些信息我们绝对不想让别人知道,比如说账号、密码、银行卡之类的,但有一些服务需要我们提交这样的信息,这时https便承担起了保护敏感信息安全的重任。其实,https相当于在普通的HTTP协议上额外增加了一层用于加密的SSL/TLS协议,除了HTTP之外,其他一些如FTP、IMAP等协议都可以通过SSL/TLS来实现安全传输。

然而,加密并不是一件很容易的事情,而是一个十分缜密而复杂的学科,我们称之为“密码学”(cryptography)。如果我们研究一下SSL/TLS协议的构造,会发现它实际上是一个集人类所有密码学技术之大成的产物,其复杂程度可想而知。为了说清楚“证书”到底是怎么回事,我们先简单看看SSL/TLS都做了些什么。

一把锁和两把锁

SSL/TLS中使用对称加密算法对传输的信息进行加密,同时还会使用公钥密码算法来交换对称密码的密钥。这句话听上去有点绕,我们用两个小故事来说说为什么会这样。

小明要给小红寄一份秘密礼物,这个礼物挺大的,于是他将礼物装在一个大箱子里面,然后在外面加了一把锁。小红收到之后,她需要打开箱子上的锁,但是锁是小明的,只有小明有钥匙。怎么办呢?小明可以约小红在咖啡馆见个面,然后当面把钥匙交给她,但在互联网中我们并没有这么一条路可以走,我们现在假设他们见不了面,看看小明还有什么别的办法没有。

小明很聪明,他想了一个巧妙的办法。他把礼物箱子的钥匙装在一个小盒子里,然后加上了一把锁寄给小红,并在盒子外面写了一张纸条,让小红收到盒子之后在原来的锁旁边再加上一把她自己的锁,然后把盒子再寄回给小明。小红照做了,于是盒子又回到了小明手里,现在上面有两把锁,一把是小明的,另一把是小红的。小明用钥匙把自己的锁打开并拿掉,然后把盒子又重新寄回给小红,现在盒子上只有小红的锁了,于是小红可以用自己的钥匙把锁打开,取出里面的礼物箱子钥匙,再用这个钥匙打开那个礼物箱子。

诚然,小明一开始就可以用两把锁的方法来直接寄他的礼物箱子,但是这里有个问题,两把锁的方法需要把东西来回邮寄三次,而礼物箱子很大,不方便这样折腾,而如果只是一把礼物箱子的钥匙,来回折腾几次也问题不大。

其实,SSL/TLS就是这样来加密信息的。一把锁的方法相当于对称密码,它速度快效率高,可以处理大量的数据,但对方需要密钥才能解密,而礼物箱子的钥匙就是对称密码的密钥;两把锁的方法相当于公钥密码,它速度慢,不适合处理大量的数据,但可以用它来安全地传送对称密码的密钥。

真的锁和假的锁

你以为有了加密就万事大吉了?假设小兰想骗到礼物箱子的钥匙,她有什么办法呢?我们再回忆一下两把锁加密的那个过程,一开始小明把加上自己的锁的盒子寄给小红,如果小兰能够在途中把这个盒子拦下来,她可以加上自己的锁然后再寄回给小明,小明其实没办法判断新加的那把锁到底是不是小红的,他把自己的锁打开并去掉,然后重新寄出去,这时小兰再次把盒子拦下来,现在盒子上面只有小兰的锁,于是小兰毫无难度地拿到了礼物箱子的钥匙。

上面这个故事的关键问题在于,小明怎么知道新加的那把锁是不是小红的?我们假设小红的锁上面有个防伪标签,比如是个二维码,小明用手机扫描这个二维码,可以跳出一个公安局的网页来验证小红的身份,这样就可以防止小兰用假的锁来招摇撞骗了。

其实,小红锁上的这个防伪标签也就是我们在SSL/TLS里所说的“证书”,它可以让我们验证网站的身份,确保我们的信息不被小兰这样的坏人骗走。小红的防伪标签是由公安局颁发并且提供验证的,网站的证书也差不多,它是由一些叫做“认证机构”(certificate authority)的组织颁发并提供验证的。

尽职尽责的浏览器

那么,浏览器为什么有时候会弹出证书错误的提示呢?那是因为浏览器在对网站提供的证书进行验证的时候发现了一些问题。在访问https网址时,浏览器会对网站提供的证书进行验证,通常包括这样几条:

1. 证书是否由可信的认证机构颁发并经过该认证机构的验证

2. 证书是否在有效期内,是否已经被声明作废

3. 证书中记录的域名是否与正在访问的网站域名一致

你看,你的浏览器还是相当专业和负责的,那么反过来说,如果上面这些验证中的任何一条出了问题,浏览器就会弹出警告说这个证书是有问题的,也就是我们开头看到的那个画面。

证书错误到底代表什么?

那么,证书有问题又意味着什么呢?我们一条一条地看。

首先,如果第1条遇到了问题,说明这个证书不是由可信的认证机构颁发的。证书也只不过是按照特定算法所生成的数字签名,因此实际上任何人都可以自己给自己颁发证书,只是可信或不可信的区别而已,就好像你可以自己给自己发一张身份证,但别人可不相信这个证,而公安局给你发一张身份证就非常可信。有些网站会使用自己颁发的证书,其中最有名的莫过于买火车票的12306了,但对于浏览器来说,网站自己颁发的证书是不可信的(下图),于是会弹出警告,因为不可信的证书很容易被伪造,就好像你可以给自己发身份证,也可以给你爸发一张身份证,反正这些身份证都不可信,别人也就无法辨认真伪。

其次,如果第2条遇到了问题,说明网站的证书已经过期或者作废了,这也有可能代表这个证书是伪造的。证书之所以难以被伪造,是因为只有拥有证书私钥的人才能生成合法的证书,而证书私钥就相当于我们刚才故事中小红自己的锁所对应的那把钥匙。万一证书的私钥泄露了,别人就可以伪造证书,在这种情况下,网站会声明这张证书作废,你的浏览器遇到这样的证书也会弹出警告,因为作废的证书很有可能是伪造的。

最后,如果第3条遇到了问题,说明证书中记录的域名和你实际访问的域名不一致,比如说你上的明明是百度,但证书却是360的,这有可能表示有人用其他网站的证书进行掉包,实际上也相当于是一种伪造,因此浏览器也会弹出警告。

总之,证书错误意味着浏览器怀疑这个网站的证书可能被伪造了,而一旦证书被伪造,就像上面故事里的小兰一样,你的通信内容就有可能被别人拦截甚至篡改,而https网址上所传输的信息往往都非常敏感,比如账号密码以及银行交易信息等等,因此一旦被窃取,后果可能会非常严重。

我该怎么办?

如果遇到浏览器弹出证书错误,贸然忽略错误而继续访问网站往往是有风险的,尤其是在咖啡厅等公共Wifi环境中,因为这样的环境十分有利于发动证书攻击。如果你在访问像银行、支付宝等网站时遇到证书错误,还是听听浏览器的建议吧,不要继续访问了,如果你碰巧在公共Wifi环境下,最好回家或者换个地方再试试看。对于12306这样坚持使用自己颁发的证书的网站,可以将网站的证书添加到电脑的可信证书列表中,但这样做本身也是存在风险的,因为不可信的证书很容易被伪造,当然,对于这种情况,作为用户来说也并没有什么更好的办法。

最后再说一句,即便浏览器没有弹出证书错误,也不能排除有恶意程序在你的电脑上劫持证书的可能性(对此有兴趣的可以搜索一下“Superfish”),因此提醒大家保持良好的上网习惯,不要点击可疑的链接或者运行可疑的程序。