100% of our funding comes from people like you. Donate today.

证书透明化(CT)日志

最近更新: | 所有文档

证书透明化(CT)是一套记录并监控 TLS 证书颁发流程的系统。 CT 使普通人观察、研究证书颁发过程的能力大幅增强,有力地促进了 CA 生态系统和网络安全的发展。 因此,CT 正迅速成为关键基础设施。

Let's Encrypt 签发的所有证书都会录入 CT 日志。 我们还有两套按年度分片的自营 CT 系统,Oak 和 Sapling。 欢迎所有可信的证书颁发机构将证书提交至我们的日志。 我们的CT日志中已包含许多证书颁发机构的根证书。 如果您所经营的证书颁发机构不在我们的可信颁发者列表中,请在此处发起 Issue。

在我们的社群论坛中开启 CT Announcements 分类的推送通知,即可第一时间获取有关 CT 日志的重要公告。

资金来源

如果您所属的机构有意支持我们持续开展这项事业,请考虑捐款或成为赞助商

技术架构

请参阅我们的英文博客文章 How Let's Encrypt Runs CT Logs

日志监控

Let's Encrypt 研发了一款开源的 CT 日志监控工具 CT Woodpecker。 我们使用这一工具监控自营日志系统的稳定性和准确性,期待它能在更多场合发挥作用。

CT 日志服务器

CT 日志在其生命期内所经历的各种状态可在此处详细了解。

生产环境日志

测试环境日志

Sunlight


日志操作

如需查看某一 CT 日志系统包含的所有根证书,可以在任意 UNIX 命令行中执行以下命令:

$ for i in $(curl -s https://oak.ct.letsencrypt.org/2020/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 日志系统。 该命令的输出中有一段数字签名,其内容实际上就是 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://oak.ct.letsencrypt.org/2020/ct/v1/add-chain
{"sct_version":0,"id":"5xLysDd+GmL7jskMYYTx6ns3y1YdESZb8+DzS/JBVG4=","timestamp":1576689972016,"extensions":"","signature":"BAMARzBFAiEA4OmuTcft9Jq3XLtcdZz9XinXCvYEY1RdSQICXayMJ+0CIHuujkKBLmQz5Cl/VG6C354cP9gxW0dfgMWB+A2yHi+E"}

为了确认 CT 日志是由 Oak 2020 区块签名的,我们可以使用刚才输出的 id 字段执行以下命令, 结果即为 CT 日志的日志 ID。

$ base64 -d <<< "5xLysDd+GmL7jskMYYTx6ns3y1YdESZb8+DzS/JBVG4=" | xxd -p -c 64 | sed -e 's/../&:/g' -e 's/:$//' | tr '[:lower:]' '[:upper:]'
E7:12:F2:B0:37:7E:1A:62:FB:8E:C9:0C:61:84:F1:EA:7B:37:CB:56:1D:11:26:5B:F3:E0:F3:4B:F2:41:54:6E

数字签名字段可用于验证证书是否已提交至日志系统。 您可以阅读我们的英文博客 SCT deep dive guide 了解如何进一步解码其内容。

$ base64 -d <<< "BAMARzBFAiEA4OmuTcft9Jq3XLtcdZz9XinXCvYEY1RdSQICXayMJ+0CIHuujkKBLmQz5Cl/VG6C354cP9gxW0dfgMWB+A2yHi+E" | xxd -p -c 16 | sed -e 's/../&:/g' -e 's/:$//' | tr '[:lower:]' '[:upper:]'
04:03:00:47:30:45:02:21:00:E0:E9:AE:4D:C7:ED:F4
9A:B7:5C:BB:5C:75:9C:FD:5E:29:D7:0A:F6:04:63:54
5D:49:02:02:5D:AC:8C:27:ED:02:20:7B:AE:8E:42:81
2E:64:33:E4:29:7F:54:6E:82:DF:9E:1C:3F:D8:31:5B
47:5F:80:C5:81:F8:0D:B2:1E:2F:84