Certificate Transparency 那些事

胡緒宜 8年前發布 | 10K 次閱讀 OpenSSL 前端技術

最近本站 HTTPS 方面有兩個變化:一是本站域名(imququ.com)加入了 Chrome 的 HSTS Preload List,從 Chrome 49 開始生效;二是我給本站 HTTPS 證書啟用了 Certificate Transparency 策略。HSTS Preload List 在我之前的文章中寫過,更多介紹及申請如何加入請點這里。本文主要介紹 Certificate Transparency。

Certificate Transparency 是什么?

HTTPS 網站的身份認證是通過證書信任鏈完成的,瀏覽器從站點證書開始遞歸校驗父證書,直至出現信任的根證書(根證書列表一般內置于操作系統,Firefox 則自己維護)。然而,受信任的 CA(證書頒發機構)有好幾百個,他們成為整個網站身份認證過程中一個較大的攻擊面。實際上,目前由于 CA 失誤導致錯誤簽發證書;以及個別 CA 出于某些目的(如監控加密流量)故意向第三方隨意簽發證書這兩種情況時有發生。

無論是 CA 無意或有意簽發出來的「非法證書」,都能通過目前的證書鏈校驗機制的驗證。這些 CA 簽發的「非法證書」相比自簽名的「無效證書」,更難被發現,即使被發現依靠現有機制也很難快速消除影響。

另外,域名所有者的管理不善也可能導致域名配置被第三方控制,從而第三方能夠向 CA 申請你網站的證書(特別是 DV 類型的證書)。這種情況,發現和處理同樣很麻煩。

Certificate Transparency 就是為了解決這些問題誕生的,它可以直譯為證書透明度,由 Google 主導,并由 IETF 標準化為 RFC6962 。Certificate Transparency 的目標是提供一個開放的審計和監控系統,可以讓任何域名所有者或者 CA 確定證書是否被錯誤簽發或者被惡意使用,從而提高 HTTPS 網站的安全性。

Certificate Transparency 整套系統由三部分組成:1)Certificate Logs;2)Certificate Monitors;3)Certificate Auditors。完整的工作原理可以看官方文檔: How Certificate Transparency Works

簡單說來,證書所有者或者 CA 都可以主動向 Certificate Logs 服務器提交證書,所有證書記錄都會接受審計和監控。支持 CT 的瀏覽器(目前只有 Chrome)會根據 Certificate Logs 中證書狀態,作出不同的反應。CT 不是要替換現有的 CA 設施,而是做為補充,使之更透明、更實時。

Certificate Logs 服務器由 Google 或 CA 部署, 這個頁面 列舉了目前已知的服務器。合法的證書提交到 CT Logs 服務器之后,服務器會返回 signed certificate timestamp(SCT),要啟用 CT 就必須用到 SCT 信息。

如何啟用 Certificate Transparency

根據官方文檔,啟用 CT 有三種方案,分別介紹如下:

1)通過 X.509v3 擴展

CA 先預簽證書,并將證書提交到 CT Logs 服務器得到 SCT 信息,然后 CA 將 SCT 做為預簽證書的擴展再次簽名,這樣就得到了一個含有 SCT 擴展的證書。通過查看 TLS 握手階段中的 Certificate 響應可以看到 SCT 信息(OID 1.3.6.1.4.1.11129.2.4.3):

2)通過 TLS 擴展

我們也可以自己提交證書給 CT Logs 服務器,得到 SCT 并存起來。然后通過配置 Web Server,使其能在 TLS 握手階段的 Server Hello 響應中啟用 signed_certificate_timestamp 擴展,傳遞 SCT 信息。具體配置方法后面再介紹,這里先來看下這個擴展長什么樣:

當然,只有客戶端在 Client Hello 請求中包含了 signed_certificate_timestamp 擴展時,服務端才需要給出對應的 SCT 回應。

3)通過 OCSP Stapling

還有一種做法是,CA 按照普通流程完成證書簽發后,再將證書提交到 CT Logs 服務器得到 SCT,然后改造 OCSP(Online Certificate Status Protocol,在線證書狀態協議)服務,將 SCT 信息包含到 OCSP 響應中。服務端啟用 OCSP Stapling(OCSP 封套)后,就可以在證書鏈中包含證書的 OCSP 查詢結果,其中就包含 SCT 信息。

簡單對比一下三種方案:

  CA 成本 開發者成本 備注
X.509v3 擴展 高(需要實時提交證書并等待返回 SCT、簽署兩次證書) DigiCert 支持這種方案( via
TLS 擴展 高(需要自己提交證書、編譯 Web Server 加入 CT 模塊、修改配置等) 任何證書都可以使用這種方案
OCSP Stapling 中(需要異步提交證書取回 SCT、改造 OCSP 服務) 中(需要啟用 Web Server 的 OCSP Stapling) Let's Encrypt 計劃支持這種方案( via

通過 TLS 擴展啟用 CT 是最普適的方案,接下來簡單介紹下在 Nginx 中如何操作:

1)獲取 SCT 文件

通過 ct-submit 這個模塊,可以方便地將證書提交給 CT Logs 服務器并得到 SCT 響應。這個模塊需要 go 語言的支持:

apt-get install golang

wget -O ct-submit.zip -c https://github.com/grahamedgecombe/ct-submit/archive/v1.0.0.zip
unzip ct-submit.zip
cd ct-submit-1.0.0
go build

編譯成功后,當前目錄會出現名為 ct-submit-1.0.0 的可執行文件。接著就可以提交了:

./ct-submit-1.0.0 ct.googleapis.com/aviator <~/www/ssl/chained.pem >~/www/scts/aviator.sct
./ct-submit-1.0.0 ct1.digicert-ct.com/log <~/www/ssl/chained.pem >~/www/scts/digicert.sct

以上代碼分別向 Google 和 Digicert 的服務器提交了證書,更多可用的服務器可以在 這個頁面 找到。

chained.pem 是我的站點證書和中間證書,最開始是站點證書,之后是中間證書。

2)編譯 Nginx,加入 CT 模塊

要讓 Nginx 支持發送 signed_certificate_timestamp 這個 TLS 擴展,需要加入 nginx-ct 這個模塊。nginx-ct 需要與 OpenSSL 1.0.2+ 或者 BoringSSL 4fac72e+ 一起編譯,不支持 LibreSSL。推薦使用 CloudFlare Patch 過的 OpenSSL( via ):

git clone https://github.com/cloudflare/sslconfig
wget -O openssl.zip -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2-stable.zip
unzip openssl.zip
mv openssl-OpenSSL_1_0_2-stable/ openssl
cd openssl && patch -p1 < ../sslconfig/patches/openssl__chacha20_poly1305_cf.patch 

cd ../

wget -c http://nginx.org/download/nginx-1.9.10.tar.gz
tar zxf nginx-1.9.10.tar.gz

wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.0.0.zip
unzip nginx-ct.zip

./configure --add-module=../nginx-ct-1.0.0 --with-openssl=../openssl --with-http_v2_module --with-http_ssl_module

然后 make 并 make install 就搞定了。 make install 之前記得先停掉 nginx 服務,不然很可能需要手動殺死之前的 nginx 進程。

3)修改配置

最后,修改 Nginx 配置,加入以下兩行并重啟服務即可:

ssl_ct               on;
ssl_ct_static_scts   /your/path/to/scts;

Certificate Transparency 與 Chrome

最后,說了這么多,如何不啟用 CT 會有什么后果呢?實際上,對大部分網站影響都不大。首先 CT 策略目前只有 Chrome 支持;其次 Chrome 也知道現在支持 CT 的網站并不多,所以對于沒有提供 SCT 信息的 HTTPS 網站也沒有太大的影響。

對于使用 EV 證書的網站,如果沒有按要求提供 SCT 信息,從 2015 年 1 月 1 日開始,Chrome 不會顯示小綠條(詳細要求可以看 這個頁面 )。一般 EV 證書提供商都會把 SCT 信息嵌入到證書之中,大家如果有 EV 證書可以檢查一下。萬一證書里沒有嵌入 SCT 信息,那最好通過 TLS 擴展的方式啟用 CT,不然買了 EV 證書,Chrome 不給顯示小綠條還是挺虧的。

對于其它類型的證書(OV、DV 等),如果沒有提供 SCT 信息,最新的 Chrome 只是會在點擊地址欄小綠鎖時給出說明,內容如下:

The server did not supply any Certificate Transparency information.服務器未提供任何 Certificate Transparency 信息。

Chrome 的這個提示內容有過調整,之前是這樣的:

The identity of this website has been verified by XXX but does not have public audit records.該網站的身份已通過 XXX 的認證,但沒有公開審核記錄。

而提供 SCT 信息之后,Chrome 的提示是這樣的:

The server supplied valid Certificate Transparency information.服務器提供了有效的 Certificate Transparency 信息。

本站截圖如下:

本文先寫到這里。明天我就要回家過年了,祝大家新春快樂,吉祥如意~

本文鏈接: https://imququ.com/post/certificate-transparency.html參與評論

-- EOF --

發表于 2016-02-03 21:59:06 ,并被添加「HTTPS、Nginx」標簽,最后修改于 2016-02-03 21:59:06 。

本站部署于「 阿里云 ECS 」。如果你也要購買阿里云服務,可以使用我的九折推薦碼  NY1Z0E (限新用戶),多謝支持!

 

來自: https://imququ.com/post/certificate-transparency.html

 

 本文由用戶 胡緒宜 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!