在《初識(shí)NSS,一文了解全貌》這篇文章詳細(xì)介紹了 NSS 密碼庫,很多開發(fā)者也許沒聽說過 NSS,但都知道 NSS 密碼庫中的可信任根證書庫(cert9.db或者cert8.db),很多軟件和服務(wù)都可以引用 NSS 的可信任證書庫。作為目前最流行的瀏覽器 Chrome和Firefox,他們?cè)诓煌钠脚_(tái)也可以使用 NSS 可信任根證書庫,所以本文就聊聊相關(guān)知識(shí),讓大家對(duì) NSS 密碼庫有更深刻的理解,理解可信任根證書庫對(duì)于理解 HTTPS 協(xié)議非常重要。
本文要回答的幾個(gè)主題:
- 你知道 Chrome 使用的根證書庫來自哪兒嗎?
- 你知道 Firefox 使用的根證書庫來自哪兒嗎?
- 你知道如何生成自簽名證書嗎?
- 你知道如何導(dǎo)出證書嗎?
- 你知道如何在 Chrome 和 Firefox 中更新證書嗎?
由于內(nèi)容比較多,所以本文分兩篇文章講解,第一篇主要講解 NSS 和 windows 的根證書庫,并且介紹如何在 Chrome 中更新根證書。第二篇講解如何更新 NSS 根證書庫,如何更新 Firefox 使用的根證書庫。
先入為主,下面表格列舉了不同平臺(tái)、不同瀏覽器引用可信任證書庫的一些情況。
| 瀏覽器平臺(tái) | Windows | Unix |
|---|---|---|
| Chrome | 使用 windows 可信任根證書庫 | 使用 NSS 可信任根證書庫 |
| Firefox | 使用 NSS 可信任根證書庫 | 使用 NSS 可信任根證書庫 |
什么是可信任根證書庫

在連接一個(gè) HTTPS 網(wǎng)站的時(shí)候,服務(wù)器會(huì)發(fā)送證書鏈,但光有證書鏈,客戶端是不能完成證書校驗(yàn)的,必須有一張根證書才能迭代完成簽名認(rèn)證,也就是說客戶端必須信任根證書才能構(gòu)建信任基礎(chǔ),那么根證書在哪兒呢?
- 在 windows 平臺(tái)中,微軟有專門的根證書庫。
- 在 Linux 平臺(tái)中,軟件和服務(wù)一般使用 NSS 根證書庫。
- 在蘋果平臺(tái)中,也有專門的根證書庫。
各個(gè) CA 機(jī)構(gòu)為了開展業(yè)務(wù),必須申請(qǐng)將自己的根證書嵌入到各個(gè)平臺(tái)中,如果申請(qǐng)被拒絕,CA 機(jī)構(gòu)將無法開展業(yè)務(wù)。
在開源軟件領(lǐng)域,NSS 根證書庫是最流行的,所以很多軟件和服務(wù)會(huì)使用 NSS 根證書庫,原因何在?關(guān)鍵就在于透明性,NSS 在審核方面做的很嚴(yán)格,堅(jiān)決杜絕非法 CA 根證書的存在。
對(duì)于普通用戶和開發(fā)者來說,一般情況下接觸不到可信任根證書庫,但是有些情況下,也有可能希望更新本地的可信任根證書庫,比如:
(1)在開發(fā)環(huán)境中應(yīng)該避免使用線上證書,因?yàn)樽C書和私鑰一起保存,由于開發(fā)環(huán)境比較混亂,容易泄露私鑰,從而帶來安全風(fēng)險(xiǎn)。
在這種情況下,可以生成一張自簽名證書,由于瀏覽器不信任該證書,訪問網(wǎng)站的時(shí)候總會(huì)提示安全風(fēng)險(xiǎn),為了避免頻繁的提示,可以手動(dòng)將證書添加到瀏覽器的可信任根證書庫中。
(2)企業(yè)內(nèi)部構(gòu)建一個(gè)私有 CA,然后給自己的業(yè)務(wù)簽發(fā)證書,這種情況很常見,比如一些內(nèi)部管理系統(tǒng)完全可以使用自簽發(fā)的證書,減少證書申請(qǐng)成本,為避免員工訪問的時(shí)候提示安全風(fēng)險(xiǎn),可以將證書添加到瀏覽器的可信任根證書庫中。
再一次解讀 certutil 和 cert9.db
在 NSS 可信任根證書庫中,所有數(shù)據(jù)保存在 cert9.db(cert9.db, key4.db, and pkcs11.txt)或者 cert8.db(cert8.db, key3.db, secmod.db)中,從 Firefox 58 版本后使用的是 cert9.db,比如在我的 windows 10 系統(tǒng)中,cert9.db 文件保存在 "C:\Users\username\AppData\Roaming\Mozilla\Firefox\Profiles\ptayekv6.default" 目錄下。
那么 cert9.db 和 cert8.db 區(qū)別在哪兒呢,這是兩種不同的數(shù)據(jù)格式。cert9.db 代表 SQLite 數(shù)據(jù)庫,而 cert8.db 代表 legacy security 數(shù)據(jù)庫。
使用 certutil 命令行工具可以管理 NSS 證書,安裝很簡單:
# Debian/Ubuntu
$ apt-get install libnss3-tools
# Fedora/cnetos
$ yum install nss-tools
首先通過下令命令查看 cert9.db 文件中包含那些根證書:
# 如果是 cert8.db 文件,不用加 sql:前綴
$ certutil -d sql:$HOME/.pki/nssdb/test -L
其中 -d 參數(shù)表示在那給目錄尋找 cert9.db 文件,-L 顯示該文件中含有的證書文件,輸出如下:
Certificate Nickname Trust Attributes
,,
GlobalSign CloudSSL CA - SHA256 - G3 ,,
DigiCert SHA2 Secure Server CA ,,
DigiCert SHA2 Extended Validation Server CA ,,
Google Internet Authority G2 ,,
GlobalSign Organization Validation CA - SHA256 - G2 ,,
GeoTrust SSL CA - G3 ,,
Symantec Class 3 Secure Server CA - G4 ,,
COMODO RSA Certification Authority ,,
Google Internet Authority G3 ,,
Let's Encrypt Authority X3 ,,
Go Daddy Secure Certificate Authority - G2 ,,
Go Daddy Root Certificate Authority - G2 ,,
Amazon Root CA 1 ,,
Starfield Services Root Certificate Authority - G2 ,,
AlphaSSL CA - SHA256 - G2 ,,
Certum Domain Validation CA SHA2 ,,
DigiCert SHA2 High Assurance Server CA ,,
RapidSSL RSA CA 2018 ,,
COMODO RSA Organization Validation Secure Server CA ,,
Amazon ,,
DigiCert Global CA G2 ,,
WoSign OV SSL CA ,,
GeoTrust RSA CA 2018 ,,
Windows 根證書庫
微軟的 CryptoAPI 也非常流行,和 NSS 一樣,都是密碼學(xué)底層代碼庫,也包含系統(tǒng)根證書庫,IE、Edge、Windows 平臺(tái)的 Chrome 用的都是微軟的系統(tǒng)根證書庫。
微軟的系統(tǒng)根證書庫保存在注冊(cè)表中,由于 windows 電腦是一個(gè)多用戶操作系統(tǒng),且允許組策略管理,所以根證書庫存在于多個(gè)位置,比如:
- CERT_SYSTEM_STORE_CURRENT_USER,代表當(dāng)前登陸用戶,對(duì)應(yīng)的證書存儲(chǔ)在 HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates 目錄。
- CERT_SYSTEM_STORE_LOCAL_MACHINE,代表本機(jī),對(duì)應(yīng)的證書存儲(chǔ)在 HKEY_LOCAL_MACHINE\Software\Microsoft\SystemCertificates 目錄。
- CERT_SYSTEM_CURRENT_USER_GROUP_POLICY,代表當(dāng)前用戶組策略,對(duì)應(yīng)的證書存儲(chǔ)在 HKEY_CURRENT_USER\Software\Policies\Microsoft\SystemCertificates 目錄。
一般情況下,windows 系統(tǒng)的登陸用戶使用的根證書庫保存在 CERT_SYSTEM_STORE_CURRENT_USER,微軟提供了一個(gè) certmgr 工具管理根證書(實(shí)際上操作的是注冊(cè)表),在 cmd 命令提示符中輸入 certmgr 打開證書管理工具,如下圖:

對(duì)于我們來說,最要關(guān)心是“受信任的根證書頒發(fā)機(jī)構(gòu)”,所有根證書都存儲(chǔ)在這個(gè)目錄下,可以通過 certmgr 工具和 certmgr 命令行添加或刪除根證書。
Chrome 如何在 windows 系統(tǒng)中更新證書
在 windows 系統(tǒng)中,Chrome 使用的是 Windows 根證書庫,如果需要更新,可以有兩種方式,第一種就是使用 certmgr 管理證書。第二種是要重點(diǎn)介紹的,就是使用 Chrome 功能菜單更新證書,實(shí)際上該功能菜單就相當(dāng)于執(zhí)行 certmgr 管理操作,只是將該功能集成到 Chrome 中。
首先我們從線上獲取一張自簽名證書(生成自簽名證書方法見本文下一篇),比如訪問 https://www.test.com,然后打開 Chrome 開發(fā)者工具(F8),選擇【Security】-【View Certificate】,然后一步步如下圖導(dǎo)出自簽名證書,并保存為 test.cer,注意保存為 .cer 格式。

接下來就是將該證書導(dǎo)入到根證書庫中,有兩種方式,第一種是雙擊 test.cer 文件,然后一步步將證書導(dǎo)入;另外中就是通過 Chrome 功能菜單導(dǎo)入,首先打開【設(shè)置】-【管理證書】菜單,然后如下圖導(dǎo)入,注意選擇將證書保存到受信任的根證書頒發(fā)機(jī)構(gòu)。

重啟 Chrome 后,然后訪問 https://www.test.com,是不是沒有安全警告了?
歡迎關(guān)注我的公眾號(hào)(yudadanwx),了解我最新的博文和本書。