前言
Google 于几年前提出了“证书透明度”概念,用于确保互联网签发的每一个 SSL 证书都被记录,有效防止 CA 秘密签发证书用于中间人攻击。证书透明度策略要求所有 SSL 证书在使用时,必须有有效的证书透明度时间戳信息,该信息可以作为 X509 扩展签名证书时间戳列表(SignedCertificateTimestampList)嵌入证书,也可以作为独立的数据由 Web 服务器在客户端访问网站时分发。而 SCT 信息则需要证书透明度日志接受证书后签发。本文介绍仅介绍证书透明度日志服务器的部署,对 SCT 签发流程和证书透明度另文讲解。本文使用 Google 官方提供的由 Go 语言实现的证书透明度日志进行部署。官方仓库:certificate-transparency-go
本文也不对其组件进行介绍,对于使用到的文件,为尽可能保证文章消息准确,均提供官方链接(如有)。
请注意,本文需要您有一定的 Docker 基础,熟悉 Docker 的存储和、网络架构
教程
证书透明度日志由两部分组成,核心数据服务:Trillian,证书透明度日志服务:CTFE。我们先进行 Trillian 的部署。
准备 docker-compose.yml 文件
Google 在其仓库中提供了模板文件,我们需要对其进行一些处理。docker-compose.yaml
因为 Trillian 要求使用兼容 MySQL 的数据库系统,在本文中我们使用外部 MariaDB 数据库,所以我们移除编排文件中自带的 MySQL 数据库服务并删除子服务对其依赖。
删除 services
标签中的 db
标签及其全部内容,随后删除 services
标签中其他服务的 depends_on
标签中的所有 db
条目,对于删除后没有其他条目的服务,直接删除整个 depends_on
标签。
随后修改每个服务中的数据库连接信息,如用户名、密码、数据库名、地址、端口等,这些信息需要保证和后续初始化数据库时使用的内容相符。数据库连接信息在各服务的 command
标签内的 "--mysql_uri=
项的值。官方默认为 test:zaphod@tcp(db:3306)/test
,格式为:用户名:密码@tcp(地址:端口)/数据库名。
随后根据实际情况,配置各个服务的网络模式、使用的 Docker 网络,确保可以访问数据库地址,端口可以被外部访问。
处理并保存编排文件后,我们需要初始化数据库。
初始化数据库
Google 在其仓库中提供了 SQL 文件,我们将其导入数据库即可。storage.sql
使用命令导入(mariadb 可换成 mysql):mariadb -u root -p<PASSWORD_FOR_ROOT> -D<DATABASE_NAME> < ./storage.sql
需要将<PASSWORD_FOR_ROOT>
换成数据库 root 用户的密码(和-p
之间无空格),DATABASE_NAME
换成数据库名字。
初始化 Docker 存储卷
我们需要创建一个 Docker 存储卷用于持久化存储透明度日志服务器所需要的一些文件。
自行创建一个名为 ctfe_config
的卷,并设置本地挂载点便于访问。
部署 Trillian
进入编排文件所在目录后,使用 docker compose up
命令启动。由于编排文件中 ctfe
服务设置了 profiles: ["frontend"]
,因此 ctfe
服务不会启动,这将允许我们在完成证书透明度日志必须的设置后再启动。
部署 CTFE
进入 Docker 存储卷 ctfe_config
的挂载点。我们需要准备下面几项:
- 证书透明度日志的加密私钥和公钥(派生自私钥)
- 证书透明度日志的配置文件
- 证书透明度日志的信任根清单(由日志自行决定)
生成私钥和公钥
使用命令:
openssl ecparam -name prime256v1 > keyparam.pem
openssl ecparam -in keyparam.pem -genkey -noout >> privkey.pem
openssl ec -in privkey.pem -pubout -out pubkey.pem
随后自行获取公私钥的 DER 格式的 GREP Hex 值(例如:\x00\x01\x02
),分别替换配置文件中 private_key
标签和 public_key
标签中的 der
标签的值为私钥 GREP Hex 的值和公钥 DER 格式的 GREP Hex 值。
处理配置文件
Google 在其仓库中提供了模板文件,我们需要对其进行一些处理。
配置文件需要下列几项提前获取的内容:
log_id
:Trillian 中 TREE 的 ID。prefix
:自行决定的纯英文+数字的日志前缀/名字。roots_pem_file
:日志接受的根证书清单。
我们首先获取第一项。
创建一个 Trillian 树,用于证书记录。首先使用命令安装 createtree
工具:
go install github.com/google/trillian/cmd/createtree@latest
随后使用命令:
createtree --admin_server=:8080
在输出的日志中即有纯数字的 log id。随后修改配置文件中 log_id
的值。
接下来我们进行第二项。证书透明度日志的前缀/名字是区分每一个日志和 TREE 的重要部分。其只接受英文字母和数字。
如:apple
/hello2024
等。起一个名字,并修改配置文件中 prefix
的值。
最后进行第三项。使用命令:
sudo apt-get install -qy ca-certificates
sudo update-ca-certificates
cat /etc/ssl/certs/* > ca-roots.pem
随后修改配置文件中 roots_pem_file
的值为 /ctfe-config/ca-roots.pem
。
启动证书透明度日志
上述步骤后,我们可以发现 Trillian 的两个服务早已启动,现在只剩下 CTFE 服务了。输入命令:
docker compose --profile frontend up
即可启动。如果出现错误则服务会持续重启。
验证日志
安装并使用 ctclient
验证日志,请替换 <LOG_PREFIX>
为你先前设置的值。
go install github.com/google/certificate-transparency-go/client/ctclient@latest
ctclient get-sth --log_uri http://localhost:8080/<LOG_PREFIX>
小广告
本人正在运行 TrusAuth 可信服务,使用自研系统,保证高可用性,同时确保各级 CA 密钥绝对安全。如果有需要欢迎联系。
了解详情可访问官网:TrusAuth Trusted PKI Service
hello, world
07
我能怎么办我也很绝望啊qwq