证书透明度日志服务器部署指南(Docker)

证书透明度日志服务器部署指南(Docker)

日暮清林
2024-03-10 / 3 评论 / 22 阅读 / 正在检测是否收录...

前言

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 的挂载点。我们需要准备下面几项:

  1. 证书透明度日志的加密私钥和公钥(派生自私钥)
  2. 证书透明度日志的配置文件
  3. 证书透明度日志的信任根清单(由日志自行决定)

生成私钥和公钥

使用命令:

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 在其仓库中提供了模板文件,我们需要对其进行一些处理。
配置文件需要下列几项提前获取的内容:

  1. log_id:Trillian 中 TREE 的 ID。
  2. prefix:自行决定的纯英文+数字的日志前缀/名字。
  3. 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

0

评论 (3)

取消
  1. 头像
    林柒
    Android · Google Chrome

    hello, world

    回复
    1. 头像
      日暮清林 作者
      Windows 10 · Google Chrome
      @ 林柒

      07

      回复
  2. 头像
    林柒
    Android · Google Chrome

    我能怎么办我也很绝望啊qwq

    回复