如何讓chrome信任自簽名證書?
在《初識NSS,一文了解全貌》這篇文章詳細介紹了 NSS 密碼庫,很多開發者也許沒聽說過 NSS,但都知道 NSS 密碼庫中的可信任根證書庫(cert9.db或者cert8.db),很多軟體和服務都可以引用 NSS 的可信任證書庫。作為目前最流行的瀏覽器 Chrome和Firefox,他們在不同的平台也可以使用 NSS 可信任根證書庫,所以本文就聊聊相關知識,讓大家對 NSS 密碼庫有更深刻的理解,理解可信任根證書庫對於理解 HTTPS 協議非常重要。
本文要回答的幾個主題:
你知道 Chrome 使用的根證書庫來自哪兒嗎?
你知道 Firefox 使用的根證書庫來自哪兒嗎?
你知道如何生成自簽名證書嗎?
你知道如何導出證書嗎?
你知道如何在 Chrome 和 Firefox 中更新證書嗎?
由於內容比較多,所以本文分兩篇文章講解,第一篇主要講解 NSS 和 windows 的根證書庫,並且介紹如何在 Chrome 中更新根證書。第二篇講解如何更新 NSS 根證書庫,如何更新 Firefox 使用的根證書庫。
先入為主,下面表格列舉了不同平台、不同瀏覽器引用可信任證書庫的一些情況。
什麼是可信任根證書庫
在連接一個 HTTPS 網站的時候,伺服器會發送證書鏈,但光有證書鏈,客戶端是不能完成證書校驗的,必須有一張根證書才能迭代完成簽名認證,也就是說客戶端必須信任根證書才能構建信任基礎,那麼根證書在哪兒呢?
在 windows 平台中,微軟有專門的根證書庫。
在 Linux 平台中,軟體和服務一般使用 NSS 根證書庫。
在蘋果平台中,也有專門的根證書庫。
各個 CA 機構為了開展業務,必須申請將自己的根證書嵌入到各個平台中,如果申請被拒絕,CA 機構將無法開展業務。
在開源軟體領域,NSS 根證書庫是最流行的,所以很多軟體和服務會使用 NSS 根證書庫,原因何在?關鍵就在於透明性,NSS 在審核方面做的很嚴格,堅決杜絕非法 CA 根證書的存在。
對於普通用戶和開發者來說,一般情況下接觸不到可信任根證書庫,但是有些情況下,也有可能希望更新本地的可信任根證書庫,比如:
(1)在開發環境中應該避免使用線上證書,因為證書和私鑰一起保存,由於開發環境比較混亂,容易泄露私鑰,從而帶來安全風險。
在這種情況下,可以生成一張自簽名證書,由於瀏覽器不信任該證書,訪問網站的時候總會提示安全風險,為了避免頻繁的提示,可以手動將證書添加到瀏覽器的可信任根證書庫中。
(2)企業內部構建一個私有 CA,然後給自己的業務簽發證書,這種情況很常見,比如一些內部管理系統完全可以使用自簽發的證書,減少證書申請成本,為避免員工訪問的時候提示安全風險,可以將證書添加到瀏覽器的可信任根證書庫中。
再一次解讀 certutil 和 cert9.db
在 NSS 可信任根證書庫中,所有數據保存在 cert9.db(cert9.db, key4.db, and pkcs11.txt)或者 cert8.db(cert8.db, key3.db, secmod.db)中,從 Firefox 58 版本後使用的是 cert9.db,比如在我的 windows 10 系統中,cert9.db 文件保存在 「C:UsersusernameAppDataRoamingMozillaFirefoxProfilesptayekv6.default」 目錄下。
那麼 cert9.db 和 cert8.db 區別在哪兒呢,這是兩種不同的數據格式。cert9.db 代表 SQLite 資料庫,而 cert8.db 代表 legacy security 資料庫。
使用 certutil 命令行工具可以管理 NSS 證書,安裝很簡單:
首先通過下令命令查看 cert9.db 文件中包含那些根證書:
其中 -d 參數表示在那給目錄尋找 cert9.db 文件,-L 顯示該文件中含有的證書文件,輸出如下圖:
Windows 根證書庫
微軟的 CryptoAPI 也非常流行,和 NSS 一樣,都是密碼學底層代碼庫,也包含系統根證書庫,IE、Edge、Windows 平台的 Chrome 用的都是微軟的系統根證書庫。
微軟的系統根證書庫保存在註冊表中,由於 windows 電腦是一個多用戶操作系統,且允許組策略管理,所以根證書庫存在於多個位置,比如:
CERT_SYSTEM_STORE_CURRENT_USER,代表當前登陸用戶,對應的證書存儲在 HKEY_CURRENT_USERSoftwareMicrosoftSystemCertificates 目錄。
CERT_SYSTEM_STORE_LOCAL_MACHINE,代表本機,對應的證書存儲在 HKEY_LOCAL_MACHINESoftwareMicrosoftSystemCertificates 目錄。
CERT_SYSTEM_CURRENT_USER_GROUP_POLICY,代表當前用戶組策略,對應的證書存儲在 HKEY_CURRENT_USERSoftwarePoliciesMicrosoftSystemCertificates 目錄。
一般情況下,windows 系統的登陸用戶使用的根證書庫保存在 CERT_SYSTEM_STORE_CURRENT_USER,微軟提供了一個 certmgr 工具管理根證書(實際上操作的是註冊表),在 cmd 命令提示符中輸入 certmgr 打開證書管理工具,如下圖:
對於我們來說,最要關心是「受信任的根證書頒發機構」,所有根證書都存儲在這個目錄下,可以通過 certmgr 工具和 certmgr 命令行添加或刪除根證書。
Chrome 如何在 windows 系統中更新證書
在 windows 系統中,Chrome 使用的是 Windows 根證書庫,如果需要更新,可以有兩種方式,第一種就是使用 certmgr 管理證書。第二種是要重點介紹的,就是使用 Chrome 功能菜單更新證書,實際上該功能菜單就相當於執行 certmgr 管理操作,只是將該功能集成到 Chrome 中。
首先我們從線上獲取一張自簽名證書(生成自簽名證書方法見本文下一篇),比如訪問 https://www.test.com,然後打開 Chrome 開發者工具(F8),選擇【Security】-【View Certificate】,然後一步步如下圖導出自簽名證書,並保存為 test.cer,注意保存為 .cer 格式。
接下來就是將該證書導入到根證書庫中,有兩種方式,第一種是雙擊 test.cer 文件,然後一步步將證書導入;另外中就是通過 Chrome 功能菜單導入,首先打開【設置】-【管理證書】菜單,然後如下圖導入,注意選擇將證書保存到受信任的根證書頒發機構。
重啟 Chrome 後,然後訪問 https://www.test.com,是不是沒有安全警告了?
如果你想了解我的新書《深入淺出HTTPS:從原理到實戰》,可以閱讀我寫了一本書《深入淺出HTTPS:從原理的實戰》。
如果你對密碼學&HTTPS協議,Web後端開發(LAMP平台)、PHP&Python感興趣,可以關注我的公眾號(yudadanwx)。
TAG:虞大膽的嘰嘰喳喳 |