技术频道


DST Root CA X3 证书过期的坑 (2021年9月30日)

采坑 DST Root CA X3 过期:


DST Root CA X3 将于 2021 年 9 月 30 日到期。这意味着那些不信任 ISRG Root X1 的旧设备在访问使用 Let's Encrypt 证书的站点时,将开始收到证书的警告。

但有一个例外是:不信任 ISRG Root X1 的旧 Android 设备将继续与 Let's Encrypt 一起使用,这要归功于 DST Root CA X3 的特殊交叉签名,该交叉签名 超过了该根的到期时间。此异常仅适用于 Android

您的网站在大多数情况下都会做正确的事情,浏览器会识别。但如果您是用其于 API 或必须支持 IoT 的设备,则需要确保两件事:

  1. API 的所有客户端都必须信任 ISRG Root X1(不仅仅是 DST Root CA X3)
  2. 如果您的 API 的客户端使用 OpenSSL,他们必须使用 1.1.0 或更高版本。在 OpenSSL 1.0.x 中,证书验证中的一个 Bug:即使是信任 ISRG Root X1 的客户端,在提供默认推荐的与 Android 兼容的证书链时也会失败。

其中信任 ISRG Root X1 的平台:


信任 DST Root CA X3 但不信任 ISRG Root X1 的平台:


这些平台将一直工作到 2021 年 9 月,但将不再验证 Let's Encrypt 证书。

  • macOS < 10.12.1
  • iOS < 10
  • Mozilla Firefox < 50
  • Ubuntu >= precise / 12.04 and < xenial / 16.04
  • Debian >= squeeze / 6 and < jessie /8
  • Java 8 >= 8u101 and < 8u141
  • Java 7 >= 7u111 and < 7u151
  • NSS >= v3.11.9 and < 3.26
  • Amazon FireOS (Silk Browser) (version range unknown)
  • Cyanogen > v10 (version that added ISRG Root X1 unknown)
  • Jolla Sailfish OS > v1.1.2.16 (version that added ISRG Root X1 unknown)
  • Kindle > v3.4.1 (version that added ISRG Root X1 unknown)
  • Blackberry >= 10.3.3 (version that added ISRG Root X1 unknown)
  • PS4 game console with firmware >= 5.00 (version that added ISRG Root X1 unknown)

下面重点来了:

已知不兼容:


  • Blackberry < v10.3.3
  • Android < v2.3.6
  • Nintendo 3DS
  • Windows XP SP3 之前的系统
    • 无法处理 SHA-2 签名的证书
  • Java 7 < 7u111
  • Java 8 < 8u101
  • Windows Live Mail(2012 版邮件客户端,而非网页端邮件服务)
    • 无法处理不包含CRL的证书
  • PS3 游戏机
  • 固件版本 < 5.00 的 PS4 游戏机

Let’s Encrypt DST Root CA X3 坑的几种解决办法:


一、重新获取证书的时候,使用 --preferred-chain "ISRG Root X1" 参数,需要注意的是:--preferred-chain 在 certbot V1.12 中才引入。

二、如果还在用 certbot-auto,则需要更新到最新的版本(我用的 1.20),之前这个版本已经过期并停止维护了。

三、也可以手动编辑 fullchain.pem 文件,去掉最后证书,并重启 Web Server,比如 nginx。

测试 Let’s Encrypt DST Root CA X3 问题是否真的解决:


如果使用的老版本 openssl ,先看下版本:

$ openssl version

OpenSSL 1.0.2k-fips  26 Jan 2017

之后,执行 openssl 命令行,测试 Let’s Encrypt DST Root CA X3 :

openssl s_client -connect commandnotfound.cn:443 -servername commandnotfound.cn
$ openssl s_client -connect commandnotfound.cn:443 -servername commandnotfound.cn
 
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = commandnotfound.cn
verify return:1
---
Certificate chain
 0 s:/CN=commandnotfound.cn
   i:/C=US/O=Let's Encrypt/CN=R3
 1 s:/C=US/O=Let's Encrypt/CN=R3
   i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFQjCC...
...
-----END CERTIFICATE-----
subject=/CN=commandnotfound.cn
issuer=/C=US/O=Let's Encrypt/CN=R3
...


 Start Time: 1634539335
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
 

Let’s Encrypt DST Root CA X3 / ISRG Root X1 扩展阅读: