如何让chrome信任自签名证书?

在《初识NSS,一文了解全貌》这篇文章详细介绍了 NSS 密码库,很多开发者也许没听说过 NSS,但都知道 NSS 密码库中的可信任根证书库(cert9.db或者cert8.db),很多软件和服务都可以引用 NSS 的可信任证书库。作为目前最流行的浏览器 Chrome和Firefox,他们在不同的平台也可以使用 NSS 可信任根证书库,所以本文就聊聊相关知识,让大家对 NSS 密码库有更深刻的理解,理解可信任根证书库对于理解 HTTPS 协议非常重要。

本文要回答的几个主题:

  • 你知道 Chrome 使用的根证书库来自哪儿吗?
  • 你知道 Firefox 使用的根证书库来自哪儿吗?
  • 你知道如何生成自签名证书吗?
  • 你知道如何导出证书吗?
  • 你知道如何在 Chrome 和 Firefox 中更新证书吗?

由于内容比较多,所以本文分两篇文章讲解,第一篇主要讲解 NSS 和 windows 的根证书库,并且介绍如何在 Chrome 中更新根证书。第二篇讲解如何更新 NSS 根证书库,如何更新 Firefox 使用的根证书库。

先入为主,下面表格列举了不同平台、不同浏览器引用可信任证书库的一些情况。

浏览器平台 Windows Unix
Chrome 使用 windows 可信任根证书库 使用 NSS 可信任根证书库
Firefox 使用 NSS 可信任根证书库 使用 NSS 可信任根证书库

什么是可信任根证书库

证书链
证书链

在连接一个 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:\Users\username\AppData\Roaming\Mozilla\Firefox\Profiles\ptayekv6.default" 目录下。

那么 cert9.db 和 cert8.db 区别在哪儿呢,这是两种不同的数据格式。cert9.db 代表 SQLite 数据库,而 cert8.db 代表 legacy security 数据库。

使用 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 参数表示在那给目录寻找 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 一样,都是密码学底层代码库,也包含系统根证书库,IE、Edge、Windows 平台的 Chrome 用的都是微软的系统根证书库。

微软的系统根证书库保存在注册表中,由于 windows 电脑是一个多用户操作系统,且允许组策略管理,所以根证书库存在于多个位置,比如:

  • CERT_SYSTEM_STORE_CURRENT_USER,代表当前登陆用户,对应的证书存储在 HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates 目录。
  • CERT_SYSTEM_STORE_LOCAL_MACHINE,代表本机,对应的证书存储在 HKEY_LOCAL_MACHINE\Software\Microsoft\SystemCertificates 目录。
  • CERT_SYSTEM_CURRENT_USER_GROUP_POLICY,代表当前用户组策略,对应的证书存储在 HKEY_CURRENT_USER\Software\Policies\Microsoft\SystemCertificates 目录。

一般情况下,windows 系统的登陆用户使用的根证书库保存在 CERT_SYSTEM_STORE_CURRENT_USER,微软提供了一个 certmgr 工具管理根证书(实际上操作的是注册表),在 cmd 命令提示符中输入 certmgr 打开证书管理工具,如下图:

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),了解我最新的博文和本书。
yudadanwx

推荐阅读更多精彩内容