扯两句HTTPS和CNNIC的CA信任被吊销之事

renyuneyun 2023年01月15日(周日) 1 mins

最近在捋一些东西,想起来2015年CNNIC的CA信任被吊销一事,于是去查了查细节。但看下来却觉得自己之前接收到的信息似乎不太对,颇为极端化和情绪化,很有失偏颇。

本文就来重新讨论一下这个六七年前的陈年往事。

HTTPS和CA

HTTPS是对HTTP的一个安全性改进,利用引入的SSL/TLS证书来确保网页内容的「真实性」,从而避免中间人攻击。简单来说,就是确认你接收到的数据(页面内容)是那个网站所传送给你的,而不是其他什么阿猫阿狗劫持数据包伪造的。其中主要内容有两项:

  1. 确认网站返回了一个有效的涵盖了其域名的证书;
  2. 利用证书验证所接收到数据是网站所发送的数据。

理论很美,技术则是依托于非对称密钥而存在,有对应的数学基础作为保障。但里边有一个绕不过去的问题:如何确认证书是有效的?毕竟原则上说,每一个证书都是一个公钥及附加的一些数据,彼此之间没有本质区别。

HTTPS对此的解法是层级信任:先信任一批CA(Certificate Authority;证书颁发机构),然后这些CA可以去信任其他CA,这样所有这些CA所颁布的证书都是有效的,而且它们都可以在出现意外时撤销自己之前所颁发的信任。于是任何一个想要使用HTTPS的网站都需要从这些CA里的一个中获取证书,然后做配置。

然而这些CA基本都是商业公司,并不是做慈善的。所以很长时间里,HTTPS证书基本都需要付费才能获取,这也造成了它普及困难。CA们给的理由也很冠冕堂皇:「我要去验证你是可信的,所以才会给你签发证书,那你不得给我点辛苦费?我们运营也需要成本,你不得出一部分?再者说了,你都不肯付费,我怎么知道你是可信的?」直到Let's Encrypt出现,可以很容易地免费获取证书,才让更多人有机会使用HTTPS。

当然了,这里有个对于HTTPS目的的不同理解的问题。技术原理上,以及Let's Encrypt的预计上,HTTPS的作用只有其最核心的两项。一是前面提到的避免中间人攻击,二是加密网络传输内容,避免嗅探。但大部分人看到「信任」、「可信」、「真实」之类的词会自动联想到社会意义的「内容真实」、「网站非虚假」上,而这就是上面那些CA理由为HTTPS增加的本不属于技术内容的附加值:这个网站是值得信任的(比如不是伪造的)。

不过这不是本文的重点,所以放在这个补注中。

但仔细想想的话,这里还有两个问题:

  1. 那些处于最高层级的CA是如何选定的?

  2. 它们对次级CA的信任又是如何维持的?

讨论这两个问题的文章很少,但其实想也知道这个问题不好讨论,因为它不是一个技术问题,而是一个社会问题。目前使用的办法是浏览器厂商或操作系统自己决定信任的(根)CA列表,这样信任链传递下去会存在更多的CA;而上级CA会制定一定要求,或是定期审查,以尽量确保次级CA在按照「正确」的方式工作;如果出现问题,上级CA可以直接吊销对次级CA的信任,这样该次级CA所签发的所有证书就都自动无效了。

这种管理当然是有效的,不然HTTPS机制早就崩塌了。吊销信任的绝对威慑力也加强了它的效果。但既然是社会问题,那么里边自然也就会和其他社会问题一样,存在徇私舞弊、暗箱操作或是双重标准的空间。而这,也是本文想试图探讨的问题。

下面先用12306的根证书事件引入一下,讨论一下CA和证书的意义或影响。然后再讨论CNNIC的事件。

12306的证书CA

稍微有点经验的人应该还记得,早年间在12306购票会要求你安装一个「根证书」,而且12306还给了很具体的指导告诉你怎么做。

那个根证书其实就是一个根CA。12306启用了HTTPS,但左手倒右手自己给自己签发了一个证书,而不是从已有的CA那里购买签发的证书,所以需要你信任它自己用来给自己签发证书的那个CA。

如前面所述,HTTPS的主要作用是用来防止中间人攻击,以及加密传输,避免你的帐号密码等信息在传输过程中被嗅探。那么原则上12306给自己签发证书也行,用户去信任它作为CA虽然麻烦点,但也不是不行。

但问题在于:

  1. 我如何信任12306的CA的管理没问题,不会被人盗取?

  2. 这个CA的权限是否仅限给12306签发证书,而不会做其他事情?

而这两点12306都没法给你保证。而且我们都知道我国政府相关的信息技术管理往往并不好,这更加剧了对它的不信任。推演下去,我们也不见得能信任12306对签名和私钥的保管能力。

如果有人拿到了12306的私钥副本,那么那个拿到副本的人可以解密我和12306网站间的一切通信,也可以伪造12306给我的通信。这会直接让12306上的HTTPS变得毫无意义。而如果有人拿到了CA密钥,该人完全可以自行搭建网站,假装任何网站(包括但不限于12306),并且一切正常地提供服务(或提供虚假服务,取决于他们的想象力)——但可以拿到中间的一切通信数据(用户名、密码、姓名、身份证号等等)。

这就是为什么我们不应该信任12306自己建立的那个CA的主要原因——不是12306网站功能表现出了什么问题,而是这种做法很诡异,很容易被其他人(不管是内部还是外部)利用。这种奇怪的风气应该被抵制。

我看到有人说12306的那个CA申明了「一切权限」,而且它似乎建议安装到操作系统中。如果如此且安装在操作系统中,那么用途会远远超出只是进行HTTPS的安全验证,远远超出了有必要的范畴。当然,我严重怀疑就凭铁道部那帮人的能力和做法,其实根本就只是因为「一切权限」省事所以才这么申明的,而不是早就计划好了日后打算偷偷做什么——不过嘛,不排除系统是外包做的,然后外包公司打算做什么。

不过几年后12306改用了已有CA的证书,这件事也成了历史。事情本身许多人已经记不清,但留下的印象就是:铁道部,共产党,坏人。

如果有兴趣了解更多细节,可以参考月光博客的这篇文章:为什么在12306买火车票要装根证书?-月光博客。本文重点不在此,所以不继续讨论。

CNNIC作为CA

CNNIC理论上是我国政府管理网络(基础)维护之类事情的机构。按架构隶属于工信部,是非盈利机构,基本上独立运营。它有过一段时间被一些浏览器和系统作为可信CA,有过签发HTTPS证书和授权下级CA的能力。

当然了,它毕竟隶属于工信部,不可能100%独立,就像不隶属政府的所谓独立非营利组织也不100%独立于出资人一样。

另外,CNNIC当年也搞过不少惹人厌的事情。没有哪个是致命的,但都挺恶心人的。有兴趣的读者可以自己去查查。这些事的大部分其实也说明它的独立性,否则没必要去做这些事以彰显存在或成绩。

但后来,在2015年,由于被查出有其一个下级CA(即埃及MCS)违规签发证书的事情,CNNIC也被主要厂商(比如微软、谷歌、Mozilla)取消了信任。

这件事报道挺多,尤其是国内技术圈,比如这篇文章这个知乎问题。不过时至今日,回过头来看看,我们也能看到这些评论的明显问题:有罪推定和扩大化。CNNIC在此事中有没有问题,这是一个方面,或许可以认定它有问题(下文讨论)。但CNNIC在CA违规事件中有问题,则立即等价于CNNIC会为一切域名签发伪造证书,等价于进行DDoS攻击,等价于偷偷安装证书……这就无疑是扩大化了,本质上和斯大林时期的大清洗、国民党搞的白色恐怖甚至中世纪猎巫区别不大。

至于怀疑CNNIC本身就是为了控制民众网络访问而设立的,或者CNNIC会配合GFW伪造其他网站的签名而进行访问封锁之类,这些你可以说是合理怀疑也可以说是污名化。「(不实的)阴谋论」和「隐藏的事实」之间的分别本身就不好判断,有时候只在于你相信什么。

抛开有罪推定,我们要讨论的问题主要是两点:

  1. CNNIC在这个错误中做了什么?

  2. CNNIC应不应该因为这件事而被取消信任?

CNNIC和MCS违规签发证书事件

这里综合以下来源的信息来尝试理解当时究竟发生了什么:

  1. 谷歌称CNNIC发布伪造CA证书-月光博客

  2. 中国封杀有关CNNIC发布中间人证书的文章 | 泡泡

  3. Mozilla对此事件的报告

  4. Google对此事件的报告

简而言之,在2015年(按照时间反推是3月11日),CNNIC签发信任了一个23天的次级CA(并给了「所有」权限),即埃及的MCS,据说用于测试用途。CNNIC与MCS的合同是要求它只能给自己拥有的域名签发证书。但随后这个MCS违规操作,(在并非这些网站申请的前提下)给一些知名网站签发了一系列(假冒)证书。很快,在3月20日,该事件就被发现,且在22日CNNIC就发布了自己的调查结果。事后调查看,MCS做这件事的原因是他们把这个CA证书安装在了一个代理服务器上,按理说在这里本来应该只能访问内网的,但有员工访问了广域网(据说是由于配置错误),于是代理服务器自动签发了证书。于是后来经过(谷歌和CNNIC一起进行的)一番联合调查,CNNIC决定改进内部工作流程,谷歌等厂商取消对CNNIC的CA的信任,并「赞赏CNNIC的决定,并欢迎他们在改进后再次申请进入可信CA」。(但我们都知道,至少到2023年初为止,CNNIC都再也没进入过可信CA。)

事情大体就这样,里边有一些细节(比如MCS到底是怎么搞的导致的违规签发)不太好确定,但至少Google认可符合事实,那么大约可以相信确实是意外而非蓄意。

单从事件看,CNNIC并非直接责任方,毕竟证书不是他们直接签发的,而是由MCS签发的,而且按照合同MCS不应该做这样的事。所以CNNIC的问题主要在于没能认真审计MCS就给他们签发(临时)证书。报道中「CNNIC直接伪造证书」的说法……可以说是假新闻。

相关讨论和责任

但除了事件本身外,还有几个额外的事情却导致CNNIC的问题增加不少:

  1. MCS称CNNIC没有给他们关于如何保管和处理证书的指导;

  2. CNNIC的Certificate Policy and Certification Practice Statement(证书政策和认证操作准则;CPS)似乎表示他们不会签发次级CA证书,但在此事件中他们签发了。

上面这两段都来自于Mozilla对此事件的报告。报告是英文的,其中关于CPS的部分引述的是翻译后的内容,且文中说「有两种理解方法」。我本打算看中文版以确认原文是什么,以减少翻译造成的误差,但链接已经失效。我暂时没有找到原文。

CNNIC对此的辩称是他们只是打算测试签发次级CA(毕竟只有23天),并且打算在下一次审计的时候(即2015年4月)更新CPS以增加相关条款。考虑到事件发生的时间,这个理由似乎也大略说得通——事件发生在当年3月,次级CA证书在4月3日到期,审计在4月,所以在审计前测试一下看看之后怎么调整,也多少有几分道理。更何况23天的次级CA时间实在太短,很大可能性其签名根本就不会在广域网中出现,如果想偷偷做点什么不应该只用这么短的。Mozilla报告中其实也谈到了这点,不过似乎是从问责的角度谈的:如果不是这次恰好发现了,那么这件事可能就这么过去了,谁都发现不了。

但CNNIC的辩称只能降低他们的错误,而不能完全消除他们的错误:你自己的政策(CPS)中说你不会签发次级CA,但你实际上签发了,这是违规操作,而且违的是你自己的规。你要是真的打算合规,为什么不等一个月,先改了CPS再签?进一步说,你能违这个规,那么我凭什么信任你不会再违其他规,那么你的CPS意义何在,那么我应该如何信任你?

那么……CNNIC这个CA应该怎么处理?

所以这件事之后,合理的做法是要求CNNIC进行整改,要培训员工对「规则」的遵守程度,并对其进行审核,并在审核通过后重新信任它。

所以,厂商们应该立即取消对CNNIC的CA的信任?

所以,CNNIC竟然再也没进入过可信CA列表?

该事件前后不过十天,就处理完毕——3月20日谷歌发现问题并通知CNNIC,4月1日谷歌和CNNIC联合声明进行整改。毕竟不是CNNIC直接签发的假证书,这样是不是有点快,难道CNNIC不应该再坚持一下?

如果说立即取消对CNNIC的信任算是合理的话,它再也没进入过可信CA列表就有点奇怪了:难道CNNIC不愿意培训员工以合规?这好像不太对吧,毕竟这个「规」是在一定的大框架下你自己定的啊?而且你本来就打算在下个月进行调整。或者是CNNIC直接放弃治疗了,打算自己把自己撤(ba)销(mian)了?那谷歌的报告中说你们自主打算重新申请又算是什么?

毕竟按照发生的事情看,CNNIC暂时并没有其他的问题:他们没有违规签发证书,没有外部次级CA,所以对整个HTTPS框架没有其他伤害。他们只需要修改政策,培训员工要遵循政策即可,没有理由不继续申请。即使它的确想做什么坏事,也得先假装是好人,拿到可信CA资格再徐徐图之啊。

怪哉。

除非,审批CA的流程中对一个CA可信度的评价核心不是它的技术指标和员工素质,而是「我喜欢或不喜欢它」?

不过我没有找到CA申请公示列表,所以不知道CNNIC到底后来有没有申请。如果哪位有更多信息,请不吝赐教。

对比其他CA违规事件

在我又看了两个其他CA的问题事件之后,我似乎发现了一些不对劲的地方。我无法从这几件事中得出确切结论,但他们的确增加了我对此事件中对CNNIC惩罚的怀疑度。

首先是2013年法国政府的ANSSI违规签发/假冒证书事件。其性质和CNNIC的事件类似,都是在域名所有者没有申请的前提下签发了证书,都是对知名网站(谷歌的网站),效果是实现中间人攻击(解密HTTPS流量)。Mozilla的前述报告将它和CNNIC的事件进行了对比,说它们有一点不同,即ANSSI事件是在「内部」的次级CA干的,而CNNIC的事件是「外部」的次级CA干的。谷歌对此事的报告说他们对此的处理是(在Chrome浏览器中)限制ANSSI的签发能力范围,而非直接吊销ANSSI的CA信任。但按照我的理解,难道不是内部出问题反而更严重么?那么以此为基础,CNNIC的处罚不应该更轻一些么(或者考虑到CPS的问题,大差不差)?

另一个是2016年WoSign(及它购买的StartCom)的违规事件。按照谷歌对此事的报告,他们也是违规签发/假冒了知名网站(GitHub)的证书,但不止如此:他们有意绕过浏览器限制和对CA的要求(WoSign knowingly and intentionally misissued certificates in order to circumvent browser restrictions and CA requirements)。换句话说,WoSign是故意伪造了证书,而且就是要给广域网用户看到并使用的。而且在事件被发现后,WoSign对他们和StartCom的关系撒谎了。并且谷歌和Mozilla联合调查发现还有更多问题,做了个事件合集,前后大小问题13个。于是最后,他们才决定吊销了对WoSign和StartCom的新证书的信任,但是从当年10月21日后开始(事件是8月17日发现的)。

不算结论的结论

综合上面这些信息,对CNNIC的处置似乎和对其他机构的处置不对等,而且逻辑不通顺。

似乎唯一能解释通的说法就是:因为CNNIC有许多其他恶心表现,所以既然它在CA问题上犯了错,为了避免它继续存在,那么厂商们就干脆借着处理CA问题的名义一并处理了,毕竟它口碑太差,用户只会拍手叫好,并自觉给它戴上帽子。

这种做法,也对也不对。

说它对,是因为它的确符合民众的意见。

说它不对,是因为它越权了,超过了厂商们作为「对CA的信任决定人」应该做的事情。

某种程度上来说,这看起来像是中国古代衙门审案,而不是现代法庭审案。

而且这里其实还有个和《少数派报告》或其他类似作品所讨论的同样的问题:如果事情还没有发生,它可以被当作证据来使用么?规则和审判可以不依靠已经发生的事情,而是依靠推测么?

按理说,作为现代科技结晶的产物,且作为「领路人」的互联网应该是最现代的。他们对分权、权限、控制、制度之类东西的尊重应该是最高的,毕竟这也是计算机、软件、互联网以及互联网企业/机构之所以存在的前提。但在这件事上,他们恰恰做了与此相反的事情。

我不知道它对不对。

但我知道它不自洽。

而我越来越意识到,不自洽是很重要的问题,是许多谎言和(意识形态)宣传赖以存在的基础。《1984》中所谓的「双重思想」其实就是营造了不自洽且不自知的思维。

我在努力将这些东西清理出去。

Backward links:

您可以在Hypothesis上的該群組內進行評論,或使用下面的Disqus評論。