8月6号,Let’s Encrypt 官方博客发表了一篇文章Let's Encrypt Root Trusted By All Major Root Programs,其中关键信息引用如下:
As of the end of July 2018, the Let’s Encrypt root, ISRG Root X1, is directly trusted by Microsoft products. Our root is now trusted by all major root programs, including Microsoft, Google, Apple, Mozilla, Oracle, and Blackberry
意思就是本月底,所有的微软产线(比如 Edge)也将直接信任 Let’s Encrypt 的根证书(ISRG Root X1),从而世界上所有的主流产品都直接支持其根证书了,那么这意味着什么?什么是直接信任?对使用 Let’s Encrypt 的证书的人有何影响?且听我慢慢道来。
意义
这一消息表示:
- Let’s Encrypt 成为了顶级 CA 机构,摆脱了二级 CA 机构的身份。
- 代表主流产品对 Let’s Encrypt 的认可,进一步突显了他的权威性。
也许你听的晕晕乎乎的,为了解明白,我们必须理解证书链的概念。
证书链
证书链是一个信任链,关系见下图:
以 Let’s Encrypt 签发的证书为例,申请者申请的证书可以称为服务器证书,运行 openssl 查看证书命令,关键信息如下:
$ openssl x509 -text -in cert1.pem -noout
Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
Subject: CN = *.simplehttps.com
这表示服务器证书是 *.simplehttps.com,它被中间证书 Let's Encrypt Authority X3 进行数字签名,也就是说服务器证书被 Authority X3 中间证书信任。
该中间证书就是 Let's Encrypt CA 机构的,用于签发服务器证书,需要说明的是中间证书可能有多张,迭代签名。
那么中间证书被谁签名了?运行下列命令:
$ openssl x509 -text -in chain1.pem -noout
Issuer: O = Digital Signature Trust Co., CN = DST Root CA X3
Subject: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
中间证书是被 DST Root CA X3 根证书(IdenTrust CA 机构的根证书)签名的,同学们可能很奇怪了,为啥 Let's Encrypt 不用自己的根证书签名其中间证书啊?这是一个好问题。
根本原因就是 Let's Encrypt 作为一个新兴 CA 机构,历史并不悠久,大部分浏览器不可能直接信任其根证书,不信任就无法构建信任基础,怎么办?Let's Encrypt 为了快速投入运营,使用 IdenTrust CA 机构的根证书(被主流产品直接信任,比如 Chrome 可信任根证书列表包含该根证书)对其中间证书进行交叉认证,从而主流产品就能信任 Let's Encrypt 服务器证书了,最终信任链链条:服务器证书>Let's Encrypt Authority X3 中间证书->DST Root CA X3 根证书。
同学们如果也使用 Let's Encrypt 证书,可以看一下证书链,打开 Chrome 开发者工具就能知晓,如图:
Let's Encrypt 有二条证书链
本质上,Let's Encrypt 有两条证书链(早就存在了)如下图:
绿色线条就是目前采用的证书链,如果主流浏览器都信任了 Let's Encrypt 根证书(ISRG Root X1),那么就可以采用红色线条标示的证书链了。也就是信任链链条:服务器证书>Let's Encrypt Authority X3 中间证书->ISRG Root X1 根证书。
经过我的配置,我的网站证书链如下图:
同学们可能会问,这是如何做到的?别着急。
使用新的证书链
本质上,Let's Encrypt 中间证书 Authority X3 有两个证书,分别是:
- Let’s Encrypt Authority X3 (IdenTrust cross-signed)
- Let’s Encrypt Authority X3 (Signed by ISRG Root X1)
他们都可以对 Let's Encrypt 服务器证书进行签名(签名用的私钥是一样的),这是关键,这两个证书分别被 ISRG Root X1 和 DST Root CA X3 签名。
聪明的同学可能想到了,在申请 Let's Encrypt 证书的时候,Let's Encrypt 目前使用 Let’s Encrypt Authority X3 (IdenTrust cross-signed) 签名,申请者获取到证书后,配置证书链(服务器证书+中间证书)后提供 HTTPS 服务。浏览器校验证书,一看中间证书是 Let’s Encrypt Authority X3 (IdenTrust cross-signed) 签名,最终找到 IdenTrust 的根证书完成签名验证。
那今天博客所说的内容表示,在申请 Let's Encrypt 证书的时候,Let's Encrypt 可以使用 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 签名,申请者获取到证书后,配置证书链(服务器证书+中间证书)后提供 HTTPS 服务。浏览器校验证书,一看中间证书是 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 签名,最终找到 Let's Encrypt ISRG Root X1 根证书完成签名验证。
可实际上,目前你申请证书的时候,Let's Encrypt 仍然使用 IdenTrust cross-signed 中间证书签名服务器证书,原因何在,主流产品(比如 Chrome)虽然已经直接信任其根证书了,但这些产品有很多旧版本存在,如果不更新,那么这些版本仍然不信任 Let’s Encrypt 根证书,Let’s Encrypt 预估 5 年以后,这些旧版本将不复存在,那个时候 Let’s Encrypt 就可以大胆用 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 中间证书签发服务器证书了。
难倒我们了吗?是否可以手动让你的网站使用新的证书链呢?答案是可以(如果不考虑旧产品线不信任 Let’s Encrypt ISRG Root X1 根证书的问题)。
上面讲到,服务器证书可以任意使用下面的中间证书签名:
- Let’s Encrypt Authority X3 (IdenTrust cross-signed),绿色线条
- Let’s Encrypt Authority X3 (Signed by ISRG Root X1) ,红色线条
任意的关键就是,这两个证书的签名私钥是一样的,我们是否可以自行配置证书链呢(红色线条)?可以:
# 下载 Authority X3 (Signed by ISRG Root X1) 中间证书
$ wget "https://letsencrypt.org/certs/letsencryptauthorityx3.pem.txt"
# 生成新的证书链,包括服务器证书+中间证书
$ cp cert1.pem letsencryptauthorityx3.pem.txt > fullchain1.pem
然后重新启动你的服务器,使用 Chrome 浏览器开发者工具观察网站证书链,是不是结果如下图:
我最近写了一本书《深入浅出HTTPS:从原理到实战》,欢迎去各大电商购买,也欢迎关注我的公众号(yudadanwx,虞大胆的叽叽喳喳),了解我最新的博文,未来可能就不在简书发文了。