证书透明化 (CT) 是一套记录并监控 TLS 证书颁发流程的系统。 CT 使普通人观察、研究证书颁发过程的能力大幅增强,有力地促进了 CA 生态系统和网络安全的发展。因此,CT 正迅速成为关键基础设施。
Let's Encrypt 签发的所有证书都会录入 CT 日志。同时我们也运作着若干 CT 日志系统, 欢迎所有可信的证书颁发机构将证书提交至我们的日志。我们的CT日志中已包含许多证书颁发机构的根证书。如果您所经营的证书颁发机构不在我们的可信颁发者列表中,请在此处发起 Issue。
在我们的社群论坛中开启 CT Announcements 分类的推送通知,即可第一时间获取有关 CT 日志的重要公告。
如果您所属的机构有意支持我们持续开展这项事业,请考虑捐款或成为赞助商。
CT 日志在其生命期内所经历的各种状态可在此处详细了解。
Let's Encrypt 目前使用 Sunlight 软件运行 static-ct 日志。
各日志系统接受的根证书、公钥、日志 ID、分片间隔等信息可以在下方列出的各系统首页中查询。
我们的生产环境 CT 日志称为 Sycamore 和 Willow,只接受由可信的 CA 颁发的证书。
用于测试的日志系统称为 Twig,既接受由可信 CA 颁发的证书,也接受由某些测试 CA 颁发的证书,包括 Let's Encrypt 测试环境的证书。
Let's Encrypt 过去的日志系统由 Trillian 软件运作,实现了 RFC 6962 接口。 详情可参阅 RFC 6962 证书透明化日志停运计划。
以下示例使用的是 Sycamore 2026h2 分片。我们的日志按时间分片,每一片区只包含到期时间落在对应范围内的证书,因此需要先在日志系统首页找到待查询证书所在的分片。
如需查看某一 CT 日志系统包含的所有根证书,可以在任意 UNIX 命令行中执行以下命令:
$ for i in $(curl -s https://log.sycamore.ct.letsencrypt.org/2026h2/ct/v1/get-roots | jq -r '.certificates[]'); do
echo '------'; base64 -d <<< "${i}" | openssl x509 -inform der -noout -issuer -serial
done
将证书提交至 CT 日志的操作通常由证书颁发机构完成。如果您想尝试自行提交,可以先获取任一网站的 PEM 格式证书,例如执行下列命令:
$ echo | \
openssl s_client \
-connect "letsencrypt.org":443 \
-servername "letsencrypt.org" \
-verify_hostname "letsencrypt.org" 2>/dev/null | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > example.crt
证书需要以特定的 JSON 格式提交,您可以使用 https://crt.sh/gen-add-chain 提供的 JSON 生成器完成格式转换。该页面会生成一份 JSON 文件,您需要下载并按需重新命名此文件,然后通过以下命令执行证书链添加操作(参见 RFC 6962 的 4.1 节),将证书提交至 CT 日志系统。我们的静态 CT 日志接口格式与 RFC 6962 一致。该命令的输出中有一段数字签名,其内容实际上就是 SCT。下文将进一步介绍这一数字签名。
$ curl \
-X POST \
--data @example-json-bundle.json \
-H "Content-Type: application/json" \
-H "User-Agent: lets-encrypt-ct-log-example-1.0" \
https://log.sycamore.ct.letsencrypt.org/2026h2/ct/v1/add-chain
{"sct_version":0,"id":"bP5QGUOoXqkWvFLRM+TcyR7xQRx9JYQg0XOAnhgY6zo=","timestamp":1783737642362,"extensions":"AAAFABSjxQU=","signature":"BAMASDBGAiEAzgwvZXjfPivGYoUr2p9yvFsi/vgA3DHUX+vL0Izm2g8CIQCvtWiPPUTYmFztu9ntrtFrg65JVuuCAZKDd+C+QD6wig=="}
为确认该 SCT 确实来自 Sycamore 2026h2 分片,我们使用上方得到的 id 字段执行以下命令, 所得结果就是分片的日志 ID,可以与日志系统首页显示的日志 ID 比较。
$ base64 -d <<< "bP5QGUOoXqkWvFLRM+TcyR7xQRx9JYQg0XOAnhgY6zo=" | xxd -p -c 64 | sed -e 's/../&:/g' -e 's/:$//' | tr '[:lower:]' '[:upper:]' 6C:FE:50:19:43:A8:5E:A9:16:BC:52:D1:33:E4:DC:C9:1E:F1:41:1C:7D:25:84:20:D1:73:80:9E:18:18:EB:3A
数字签名字段可用于验证证书是否已提交至日志系统。您可以阅读我们的英文博客 SCT deep dive guide 了解如何进一步解码其内容。
$ base64 -d <<< "BAMASDBGAiEAzgwvZXjfPivGYoUr2p9yvFsi/vgA3DHUX+vL0Izm2g8CIQCvtWiPPUTYmFztu9ntrtFrg65JVuuCAZKDd+C+QD6wig==" | xxd -p -c 16 | sed -e 's/../&:/g' -e 's/:$//' | tr '[:lower:]' '[:upper:]' 04:03:00:48:30:46:02:21:00:CE:0C:2F:65:78:DF:3E 2B:C6:62:85:2B:DA:9F:72:BC:5B:22:FE:F8:00:DC:31 D4:5F:EB:CB:D0:8C:E6:DA:0F:02:21:00:AF:B5:68:8F 3D:44:D8:98:5C:ED:BB:D9:ED:AE:D1:6B:83:AE:49:56 EB:82:01:92:83:77:E0:BE:40:3E:B0:8A