阿裏雲 CDN HTTPS 最佳實踐——OCSP Stapling(四)
背景
下圖是互聯網 PKI 證書的生命周期:
對於一個可信任的 CA 機構頒發的有效證書,在證書到期之前,隻要 CA 沒有把其吊銷,那麼這個證書就是有效可信任的。有時,由於某些特殊原因(比如私鑰泄漏,證書信息有誤,CA 有漏洞被黑客利用,頒發了其他域名的證書等等),需要吊銷某些證書。那瀏覽器或者客戶端如何知道當前使用的證書已經被吊銷了呢,通常有兩種方式:CRL(Certificate Revocation List,證書吊銷列表)和 OCSP(Online Certificate Status Protocol,在線證書狀態協議)
- CRL
CRL 是由 CA 機構維護的一個列表,列表中包含已經被吊銷的證書序列號和吊銷時間。瀏覽器可以定期去下載這個列表用於校驗證書是否已被吊銷。可以看出,CRL 隻會越來越大,而且當一個證書剛被吊銷後,瀏覽器在更新 CRL 之前還是會信任這個證書的,實時性較差。在每個證書的詳細信息中,都可以找到對應頒發機構的 CRL 地址。
- OCSP
OCSP 是一個在線證書查詢接口,它建立一個可實時響應的機製,讓瀏覽器可以實時查詢每一張證書的有效性,解決了 CRL 的實時性問題,但是 OCSP 也引入了一個性能問題,某些客戶端會在 SSL 握手時去實時查詢 OCSP 接口,並在得到結果前會阻塞後續流程,這對性能影響很大,嚴重影響用戶體驗。(OCSP 地址也在證書的詳細信息中)
OCSP Stapling 就是為了解決 OCSP 性能問題而生的,其原理是:在 SSL 握手時,服務器去證書 CA 查詢 OCSP 接口,並將 OCSP 查詢結果通過 Certificate Status 消息發送給瀏覽器,從而讓瀏覽器跳過自己去驗證的過程而直接拿到結果,OCSP 響應本身有了簽名,無法偽造,所以 OCSP Stapling 既提高了效率也不會影響安全性。另外服務器有更好的網絡,能更快地獲取到 OCSP 結果,同時也可以將結果緩存起來,極大的提高了性能、效率和用戶體驗。
實現
Tengine 開啟 OCSP Stapling 的主要配置是:
ssl_stapling on;
但是,對於阿裏雲 CDN 這種一個 server 塊接入很多域名和使用動態證書的場景就不能簡單的這麼配置了,必須在 lua 中根據實際使用的證書去所屬 CA 查詢 OCSP 接口,獲取 OCSP 結果的相關 lua ffi 接口在 lua-nginx 模塊中已經有實現,我們需要做的就是異步獲取 OCSP 結果和對結果進行緩存。該功能目錄在 CDN 配置管理後台已經可配了,後續會開放到用戶控製台。
最後更新:2017-11-13 17:34:34