在《初识NSS,一文了解全貌》这篇文章详细介绍了 NSS 密码库,很多开发者也许没听说过 NSS,但都知道 NSS 密码库中的可信任根证书库(cert9.db或者cert8.db),很多软件和服务都可以引用 NSS 的可信任证书库。作为目前最流行的浏览器 Chrome和Firefox,他们在不同的平台也可以使用 NSS 可信任根证书库,所以本文就聊聊相关知识,让大家对 NSS 密码库有更深刻的理解,理解可信任根证书库对于理解 HTTPS 协议非常重要。 本文要回答的几个主题: 由于内容比较多,所以本文分两篇文章讲解,第一篇主要讲解 NSS 和
windows 的根证书库,并且介绍如何在 Chrome 中更新根证书。第二篇讲解如何更新 NSS 根证书库,如何更新 Firefox 使用的根证书库。 先入为主,下面表格列举了不同平台、不同浏览器引用可信任证书库的一些情况。 证书链 在连接一个 HTTPS 网站的时候,服务器会发送证书链,但光有证书链,客户端是不能完成证书校验的,必须有一张根证书才能迭代完成签名认证,也就是说客户端必须信任根证书才能构建信任基础,那么根证书在哪儿呢?
各个 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:\Users\username\AppData\Roaming\Mozilla\Firefox\Profiles\ptayekv6.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 电脑是一个多用户操作系统,且允许组策略管理,所以根证书库存在于多个位置,比如:
一般情况下,windows 系统的登陆用户使用的根证书库保存在 CERT_SYSTEM_STORE_CURRENT_USER,微软提供了一个 certmgr 工具管理根证书(实际上操作的是注册表),在 cmd 命令提示符中输入 certmgr 打开证书管理工具,如下图: 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,是不是没有安全警告了? yudadanwx 推荐阅读更多精彩内容
|