扯兩句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評論。