8月6號,Let’s Encrypt 官方博客發(fā)表了一篇文章Let's Encrypt Root Trusted By All Major Root Programs,其中關(guān)鍵信息引用如下:
As of the end of July 2018, the Let’s Encrypt root, ISRG Root X1, is directly trusted by Microsoft products. Our root is now trusted by all major root programs, including Microsoft, Google, Apple, Mozilla, Oracle, and Blackberry
意思就是本月底,所有的微軟產(chǎn)線(比如 Edge)也將直接信任 Let’s Encrypt 的根證書(ISRG Root X1),從而世界上所有的主流產(chǎn)品都直接支持其根證書了,那么這意味著什么?什么是直接信任?對使用 Let’s Encrypt 的證書的人有何影響?且聽我慢慢道來。
意義
這一消息表示:
- Let’s Encrypt 成為了頂級 CA 機構(gòu),擺脫了二級 CA 機構(gòu)的身份。
- 代表主流產(chǎn)品對 Let’s Encrypt 的認可,進一步突顯了他的權(quán)威性。
也許你聽的暈暈乎乎的,為了解明白,我們必須理解證書鏈的概念。
證書鏈
證書鏈?zhǔn)且粋€信任鏈,關(guān)系見下圖:

以 Let’s Encrypt 簽發(fā)的證書為例,申請者申請的證書可以稱為服務(wù)器證書,運行 openssl 查看證書命令,關(guān)鍵信息如下:
$ openssl x509 -text -in cert1.pem -noout
Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
Subject: CN = *.simplehttps.com
這表示服務(wù)器證書是 *.simplehttps.com,它被中間證書 Let's Encrypt Authority X3 進行數(shù)字簽名,也就是說服務(wù)器證書被 Authority X3 中間證書信任。
該中間證書就是 Let's Encrypt CA 機構(gòu)的,用于簽發(fā)服務(wù)器證書,需要說明的是中間證書可能有多張,迭代簽名。
那么中間證書被誰簽名了?運行下列命令:
$ openssl x509 -text -in chain1.pem -noout
Issuer: O = Digital Signature Trust Co., CN = DST Root CA X3
Subject: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
中間證書是被 DST Root CA X3 根證書(IdenTrust CA 機構(gòu)的根證書)簽名的,同學(xué)們可能很奇怪了,為啥 Let's Encrypt 不用自己的根證書簽名其中間證書?。窟@是一個好問題。
根本原因就是 Let's Encrypt 作為一個新興 CA 機構(gòu),歷史并不悠久,大部分瀏覽器不可能直接信任其根證書,不信任就無法構(gòu)建信任基礎(chǔ),怎么辦?Let's Encrypt 為了快速投入運營,使用 IdenTrust CA 機構(gòu)的根證書(被主流產(chǎn)品直接信任,比如 Chrome 可信任根證書列表包含該根證書)對其中間證書進行交叉認證,從而主流產(chǎn)品就能信任 Let's Encrypt 服務(wù)器證書了,最終信任鏈鏈條:服務(wù)器證書>Let's Encrypt Authority X3 中間證書->DST Root CA X3 根證書。
同學(xué)們?nèi)绻彩褂?Let's Encrypt 證書,可以看一下證書鏈,打開 Chrome 開發(fā)者工具就能知曉,如圖:

Let's Encrypt 有二條證書鏈
本質(zhì)上,Let's Encrypt 有兩條證書鏈(早就存在了)如下圖:

綠色線條就是目前采用的證書鏈,如果主流瀏覽器都信任了 Let's Encrypt 根證書(ISRG Root X1),那么就可以采用紅色線條標(biāo)示的證書鏈了。也就是信任鏈鏈條:服務(wù)器證書>Let's Encrypt Authority X3 中間證書->ISRG Root X1 根證書。
經(jīng)過我的配置,我的網(wǎng)站證書鏈如下圖:

同學(xué)們可能會問,這是如何做到的?別著急。
使用新的證書鏈
本質(zhì)上,Let's Encrypt 中間證書 Authority X3 有兩個證書,分別是:
- Let’s Encrypt Authority X3 (IdenTrust cross-signed)
- Let’s Encrypt Authority X3 (Signed by ISRG Root X1)
他們都可以對 Let's Encrypt 服務(wù)器證書進行簽名(簽名用的私鑰是一樣的),這是關(guān)鍵,這兩個證書分別被 ISRG Root X1 和 DST Root CA X3 簽名。
聰明的同學(xué)可能想到了,在申請 Let's Encrypt 證書的時候,Let's Encrypt 目前使用 Let’s Encrypt Authority X3 (IdenTrust cross-signed) 簽名,申請者獲取到證書后,配置證書鏈(服務(wù)器證書+中間證書)后提供 HTTPS 服務(wù)。瀏覽器校驗證書,一看中間證書是 Let’s Encrypt Authority X3 (IdenTrust cross-signed) 簽名,最終找到 IdenTrust 的根證書完成簽名驗證。
那今天博客所說的內(nèi)容表示,在申請 Let's Encrypt 證書的時候,Let's Encrypt 可以使用 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 簽名,申請者獲取到證書后,配置證書鏈(服務(wù)器證書+中間證書)后提供 HTTPS 服務(wù)。瀏覽器校驗證書,一看中間證書是 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 簽名,最終找到 Let's Encrypt ISRG Root X1 根證書完成簽名驗證。
可實際上,目前你申請證書的時候,Let's Encrypt 仍然使用 IdenTrust cross-signed 中間證書簽名服務(wù)器證書,原因何在,主流產(chǎn)品(比如 Chrome)雖然已經(jīng)直接信任其根證書了,但這些產(chǎn)品有很多舊版本存在,如果不更新,那么這些版本仍然不信任 Let’s Encrypt 根證書,Let’s Encrypt 預(yù)估 5 年以后,這些舊版本將不復(fù)存在,那個時候 Let’s Encrypt 就可以大膽用 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 中間證書簽發(fā)服務(wù)器證書了。
難倒我們了嗎?是否可以手動讓你的網(wǎng)站使用新的證書鏈呢?答案是可以(如果不考慮舊產(chǎn)品線不信任 Let’s Encrypt ISRG Root X1 根證書的問題)。
上面講到,服務(wù)器證書可以任意使用下面的中間證書簽名:
- Let’s Encrypt Authority X3 (IdenTrust cross-signed),綠色線條
- Let’s Encrypt Authority X3 (Signed by ISRG Root X1) ,紅色線條
任意的關(guān)鍵就是,這兩個證書的簽名私鑰是一樣的,我們是否可以自行配置證書鏈呢(紅色線條)?可以:
# 下載 Authority X3 (Signed by ISRG Root X1) 中間證書
$ wget "https://letsencrypt.org/certs/letsencryptauthorityx3.pem.txt"
# 生成新的證書鏈,包括服務(wù)器證書+中間證書
$ cp cert1.pem letsencryptauthorityx3.pem.txt > fullchain1.pem
然后重新啟動你的服務(wù)器,使用 Chrome 瀏覽器開發(fā)者工具觀察網(wǎng)站證書鏈,是不是結(jié)果如下圖:

我最近寫了一本書《深入淺出HTTPS:從原理到實戰(zhàn)》,歡迎去各大電商購買,也歡迎關(guān)注我的公眾號(yudadanwx,虞大膽的嘰嘰喳喳),了解我最新的博文,未來可能就不在簡書發(fā)文了。