你好,我是范学雷。
先来做个自我介绍吧。我之前在Oracle做过首席软件工程师,同时呢,也是Java SE 安全组成员和OpenJDK 评审成员。如果你认识我的话,估计是因为我的极客时间专栏,我已经和极客时间合作第三季了,是《代码精进之路》《实用密码学》和《深入剖析 Java 新特性》的作者。安全领域本身是比较小众的,我一直有意做一些相关的分享,正好昊天的专栏有涉及加密有关的知识,在编辑同学的邀请下,就欣然前来助助阵。
这次我们讨论的话题,是关于数字证书的现实痛点,及其未来的发展走向问题。要想了解数字证书的现状,我们需要先来了解数字证书的背后逻辑和各路玩家。
数字证书主要的玩家主要涉及三个角色。第一个,就是颁发证书的机构,我们通常叫它CA,也就是证书权威机构。第二个玩家是实用证书的持有者,我们通常叫它证书的终端实体。第三个玩家是证书的使用者,他们才是证书的最终消费者。
数字证书体系的设计,就是要帮助用户验证对方的身份,解决双方交流中的“对方是谁”或者“我在和谁说话”这个问题。从数字证书的角度出发,就是数字证书的消费者要通过验证数字证书,完成对数字证书持有者的身份认证。
可是,凭什么你有了一张数字证书,我就要信任你的身份呢?这个信任关系是怎么来的呢?这就要说说证书权威机构了。
证书权威机构,名字里虽然带着权威,但实际上,它可能并不是一个有权有威的机构。这个机构发布了一份认证实践声明,来说明自己做事的规则和流程。 你如果认可这份声明,并且信任它的执行流程,那么这个机构就是你信任的机构。当然,是否信任这个机构,是你的权利,如果你不信任它,它就一点也不威风。
乍一看,数字证书的最终消费者是互联网用户,并且可以选择是否信任一个证书权威机构,似乎有点上帝的味道。真实的情况是,数字证书的最终消费者不是证书权威机构的用户,而是数字证书的持有者,因为,数字证书的持有者才是给证书权威机构付费的实体。
通过这一点我们会发现,数字证书权威机构代表的是证书持有者的利益,而不是数字证书消费者的利益。数字证书持有者和数字证书消费者的利益,不一定总是一致的。如果出现利益冲突,数字证书消费者的利益不一定会被放在首位。作为一个数字证书的消费者,我们无条件地信任一个证书权威机构,但是它却不代表我们的利益,这的确有点讽刺的意味。
事实上,对于消费者而言,如果一个证书权威机构能够按照它的声明和规则做事,我们也许少一些担忧。但是,声明的背后,往往可能是一些有意或者无意的错误,也可能是一定存在漏洞的数字化代码。不论是哪一种问题,都说明了证书权威机构并不总是能够按照它的声明做事。
我们知道,在数字的世界里,能够代表Google的数字证书,表示的就是Google的身份。如果这个证书的持有者不是Google,这就表明这是一个假冒的身份。数字证书本来就是要解决身份认证的问题。现在不适当的数字证书披上了一层合法的外衣,可以堂而皇之的以假冒的身份玩耍各种欺骗的手段。这样的例子屡见不鲜,比如说没有经过Google的允许,证书权威机构就颁发能够代表Google的数字证书。
2011年7月10日,证书权威机构DigiNotar未经Google许可,给Google发了数字证书,其中是否存在某种阴谋,我们不得而知。2011年8月28日,该事情被披露了出来,过了不到一个月的时间,DigiNotar就宣布破产了。这种未经许可给Google发了数字证书的证书的故事,不是第一例,也不会是最后一例。甚至有的证书权威机构趁着平安夜的假期和万家灯火的祥和气氛,像圣诞老人一样,给Google颁发了一张不属于它的证书,作为圣诞节的礼物。
我们可以肯定的是,这种不期而至的礼物,并不只是对Google一个机构青睐有加。我们看到这么多假冒Google的数字证书披露出来,只是Google影响力和强大技术能力的一个侧面印证。普通的联网用户,甚至是很多的机构,并没有对应的能力去鉴别那些披着合法外衣的、假冒的数字证书。
发生类似的事情,Google无疑是受害者之一;但是受损失最大的,一定是我们这些互联网用户。我们的利益和隐私,可能会在这样的有意无意中,遭受到巨大的损失;而且,我们还不明真相,不知所以,不知所终。
为什么DigiNotar给Google发一张数字证书,就能影响到我们的利益和隐私呢?这还要从我们使用证书的习惯说起。
尽管证书是互联网安全的基石,但在一般情况下,我们自己并不直接使用证书,而是通过代理人,也就是浏览器使用证书。所以,如果不是安全专业人士,我们根本不会关心数字证书,当然就不会知道谁是证书权威机构,以及该信任哪些证书权威机构。这些决策,都是我们的代理人替我们做出来的。
如果你能够阅读浏览器信任的证书权威机构,你可以看到一个长长的列表(通常是几十个或者上百个机构)。我敢说,即便你是资深的安全专业人士,也很难了解每一个证书权威机构。这些证书权威机构分散在世界各地,归属于不同的国家和地区,代表着不同的利益和势力。
想象一下,如果这个长长的列表里,每一个证书权威机构都有着相同的权威,它颁发的每一个证书我们都无条件信任,这也就意味着,在这个长长的列表里,只要有一个证书权威机构捣乱,整个数字证书的逻辑就崩塌了。要求每一个证书权威机构都完美地按照它的声明和规则做事,不允许出现异数,这实在是有违基本常识的假设。
类似于DigiNotar这样的案例,在我们的头上狠狠地敲了以榔头,足够被我们打晕。当我们醒过来的时候,揉揉脑袋上久久不能消退的大包,才认识到我们太天真。我们选择信任证书权威机构,但是它们并不都是可以信任的,或者说没有一个是可以无条件信任的。让人更加不安的是,作为用户,我们如果想继续使用互联网,除了继续信任证书权威机构以外,并没有其他的选择。这样,在“不可信任”和“不得不信任”中间,一对矛盾就凸显出来。
当我们认识到矛盾的时候,就是变革要发生的时候。既然已经认识到了证书权威机构并不可信,但是又没有合适的办法摆脱它,我们就要想办法把它关在笼子里,小心地看护它、监管它。如果一个证书权威机构没有按照它的声明和规则做事,我们最好第一时间就知道。解决的办法,就是增加证书的透明度(Certificate Transparency)。
如果一个证书权威机构颁发了一张证书,这张证书立即就会被公开地记录在案。任何机构,都可以查阅在案的记录。有了这个记录,Google就可以查阅还有没有证书权威机构未经授权,就擅自给自己发了一张证书了。这就是证书透明度的机制。
遗憾的是,如果一个证书权威机构颁发了一张证书,但是不公开记录在案,那么这张证书就还是没有透明度,还是可以兴风作浪。证书透明度的机制,帮助乖孩子解决掉了无意识错误的问题, 但是并没有让坏孩子产生错误意识。证书透明度的机制,增加了监管,但是并没有解决最根源的问题。
当我们认识到毫无退路的时候,还有一句话叫做“向死而生”。既然证书权威机构并不可信,它还有存在的必要吗?这是一个一直拷问着互联网安全架构设计者的问题。十年前,业界就已经开始做这样的尝试了。
其中影响最大的,就是把数字证书和DNS绑定,把证书存放在DNS的记录里。当我们解析域名的时候,也就获得了这个域名对应的数字证书。只要DNS的安全逻辑没有问题,这个数字证书也就没有问题、值得信任的。
这样,一个域名的所有者就不再需要证书权威机构给自己发证书了,颁发证书的工作,他自己就能完成。而且,在这样的框架下,证书权威机构即使给自己发证书,也不会被采用,威胁自然也不会发生。这样,数字证书就真的完全掌控在它的持有者手里了,既不能被修改,也不能被假冒。同样地,数字证书的消费者也就有了更清楚、更直接的信任关系。这是一个更简单的、更有效率、责权利一致的办法。
遗憾地是,目前DNS的架构,并不能保证它的安全逻辑没有问题。要想解决DNS架构和部署的安全问题,还有很长的一段路要走。但是,我们已经可以看到曙光了。
就像俗世的规则一样,在数字证书的世界里,责权不一致的原始设计,也会面临各种各样的问题;而解决的办法,也许是回归到更简单的、责权一致的路上来。