惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

Razeen`s Blog

Let's Encrypt 推出 Gen Y 根证书架构:揭示 Web PKI 的五大未来趋势 通过 Wi-Fi 自动备份你的 iPhone 到 Nas 管理培训感悟:从技术视角看管理之路 UPS 一拖多:保护你的 NAS 和 Linux 服务器 从影音中心到 AI 助手:我的50款 Homelab 服务清单 从SSL证书有效期将缩短到47天聊开去 部署一个自己的 Running Page 谈谈特斯拉 Model Y 用车一年的感受和费用分析 弃用 Disqus 评论,使用自建 Waline 使用 Prometheus 和 Grafana 搭建你的证书监控面板 服务器迁移记:一次磁盘换板引发的Linux分区与挂载的学习 改善信息来源, 利用 RSS 高效获取资讯 (RSShub + Reeder5 + WeWe RSS) 多种 Docker 镜像拉取解决方案与实践 App分享 | AppCleaner - Mac上的卸载神器 Azure OpenAI API 申请和使用 如何开通 OneKey 虚拟信用卡,并充值消费 如何拥有一个可长期在国内使用的国外手机号码 分享开通 ChatGPT Plus 过程 如何开通 Depay 虚拟信用卡,并充值消费 如何开通欧易Web3钱包, 交易入账 如何5分钟内1块钱注册 ChatGPT 如何注册美区的 Apple ID (2023年/无需科学上网) NAS折腾记(11): NASTool3.0体验和降级 NAS折腾记(10): Docker版本的NASTool配置 NAS折腾记(9): NASTool与微信交互,微信发送消息远程下载电影【多图】 NAS折腾记(8):群晖安装 NASTool 实现影音半自动化【多图】 内网穿透(2):Tailscale 组网实现内网穿透,操作简单,无成本 内网穿透(1):总结了11中内网穿透的方式,总有一种适合你 NAS折腾记(7):从零开始设置(黑)群晖系统 NAS折腾记(6):黑群晖系统安装好后怎么洗白? NAS折腾记(5):群晖硬盘休眠设置与分析 NAS折腾记(4): 20分钟手把手带你完美安装 DS918+ 黑群晖7.1.1 NAS折腾记(3):NAS 装机 NAS折腾记(2):B360-ITX 双M.2 双2.5G网口 6 SATA主版 开箱 NAS折腾记(1):328元的4盘位Nas机箱开箱 Openwrt + Clash 全局科学上网 Newifi3 刷入 OpenWrt 固件 v21.02 利用 Markdown 画一些流程图、时序图、甘特图等 Homelab(8): 搭建自用 Gitlab 与 Docker 仓库 Nginx Tcp 转发保留客户端真实 IP (PROXY Protocol) Homelab (7):IPSec VPN(基于证书认证)客户端设置 Homelab (6): 基于自签发证书的 IPSec VPN 搭建 Homelab (5): DDNS 动态域名解析 Homelab (4): Linux 服务器基础环境准备 Homelab (3): 整体网络与基础硬件介绍 Go学习笔记(十)老项目迁移 go module 大型灾难记录 Github Actions 初体验之自动化部署 Hexo 博客 记一次 Nginx DNS 缓存导致转发问题 Homelab (2): 电信悦me网关修改桥接模式,路由器拨号 Homelab (1):5分钟上手黑群晖 NAS 终极 Bash 脚本指南 Typora 自动上传图片到七牛云 Ubuntu 20.04 LTS 有线网卡驱动安装 折腾 Ubuntu 20.04 LTS 开发环境 Go学习笔记(九) 计时器的生命周期[译] 利用 git hook 规范你的代码与 commit message 规范 git commit message 与自动化版本控制 超详细 vim 配置 (with MacVim) Golang 中的 RESTful API 最佳实践 折腾服务器(开篇) 我的第一台个人服务器 Newifi3 实现低成本家庭级科学上网 Go学习笔记(八) | 使用 os/exec 执行命令 如何用 Go 调用 Windows API Mac OS 自动根据 WI-FI 名字改变网络位置 关于 Docker 清理 MIME Types 速查表 Go学习笔记(七) | 理解OAuth 2.0并实现一个客户端 我又又又把博客迁移了 Go学习笔记(六) | 使用swaggo自动生成Restful API文档 Go学习笔记(五) | 使用代码片段(snippets)提高编码效率 书单 - 2018 IPFS 初体验,利用 IPFS 托管你的静态网站 记一次 PostgreSQL LIKE 索引优化,联合字段 LIKE 查询优化。 Disqus 添加有趣的 Reactions 的功能 TLS 1.3 详解 (RFC 8446解读) gRPC在Go中的使用(三)gRPC实现TLS加密通信与流模式 gRPC在Go中的使用(二)gRPC实现简单通讯 gRPC在Go中的使用(一)Protocol Buffers语法与相关使用 CentOS 安装 tshark 抓包工具 Go学习笔记(四) | win上使用VSCode搭建Go开发环境 日常 Postgres 数据库点滴记录 简单了解 PKCS 规范 美食篇 | DIY戚风蛋糕(烤箱做蛋糕) Go学习笔记(三) | 怎么写Go基准测试(性能测试) TLS1.3正式更新,为Nginx添加TLS1.3的支持 一次诡异的数据库删除 GitHub Pages自定义域名开启HTTPS 证书透明度是什么?它是怎么工作的? Go学习笔记(二) | 我对 recover 的一点误解 修复远程登陆 Centos 时,出现 UTF-8 Warning HTTPS篇之SSL握手过程详解 Go学习笔记(一) | postgres与golang点点滴滴 AWS 命令行界面(aws-cli)从安装到快速上手 数字证书分类及怎么区分各类数字证书 常用 linux 命令小结(一)文件目录操作 云服务器搭建 hexo 博客,git hooks自动更新 SSH 免密登陆, SSH Config 配置 Golang CGO Mac 交叉编译 Windows 使用 goose 让数据库迁移更加轻松 开始使用Ghost
搭建证书透明度(certificate-transparency)日志服务之从入门到放弃
2018-01-14 · via Razeen`s Blog

最近在搭建证书透明度日志服务,折腾了几天,最后结果是 “测试完美通关,部署各种出错"。So, 先暂停一段时间,写篇博客记录一下这几天傻傻折腾的过程。

后面certificate-transparency 简写为CT。

CT是什么?

从中文翻译就可看出,证书透明嘛,就是让证书透明化。

至于各中细节,屈屈有篇博客写的蛮详细的,我就不赘述了。

当然,官方也有更详细的文档说明。

搭建CT日志服务

1)Before 搭建

看完上面的博客或文档,我们知道CT系统的组成有这么三个部分:

​ 1)Certificate Logs;2)Certificate Monitors;3)Certificate Auditors。

而我们这里搭建的就是第一部分 Certificate Logs ,也就是我说的CT日志服务。

CT的开源项目除了包含了CT日志服务(ct-server),还有一个日志的只读服务(ct-mirror)以及一些日志的管理维护日志服务。这里我们主要搭建的是ct-server,当然也会用到一些工具。

Deploying a CT Log指明了两种搭建方法,这里我用docker搭建,docker-compose编排。

其中主要需要的相关服务:

  • ct-server (CT日志的主体服务)
  • prom (监控服务)
  • etcd (数据同步服务)

就像官方的部署图

拟部署CT三台日志服务,三台etcd组成集群,负载的负载均衡就是后话了。

2)编译代码

在构建之前,我们先需要编译代码。这里就得注意一下编译的环境了。由于一开始傻傻的文档都没看,直接在我的Mac(os x 10.13)上编译,结果各种C库问题。

在文档中已经明确指出:

The supported platforms are:

  • Linux: tested on Ubuntu 14.04; other variants (Fedora 22, CentOS 7) may require tweaking of compiler options.
  • OS X: version 10.10
  • FreeBSD: version 10.*

我这里采用的是Ubuntu14.04平台,在docker内编译,Dockerfile如下:

FROM ubuntu:14.04

# 安装基本环境
RUN apt-get update \
        && apt-get upgrade -y \
        && apt-get install --no-install-recommends --no-install-suggests -y \
                autoconf \
                automake \
                libtool \
                shtool \
                clang \
                git \
                make \
                tcl \
                pkg-config \
                python \
                curl \
                ca-certificates
                
# 由于depot_tools资源在墙外,docker内下载很慢,我就直接下的COPY进去了
# git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
COPY depot_tools /root/depot_tools

# 由于ubuntu上的cmake版本还停留在 需要手动升级下cmake,同上的原因,我也就copy进来了
# curl http://www.cmake.org/files/v3.4/cmake-3.4.1.tar.gz
COPY cmake-3.4.1 /root/cmake-3.4.1
RUN  apt-get install -y build-essential \
        && cd /root/cmake-3.4.1 \
        && ./configure \
        && make \
        && apt-get install -y checkinstall \
        && checkinstall \
        && make install \
        && cmake --version 

WORKDIR /root

# 编译
RUN export PATH=$PATH:/root/depot_tools \
        && export CXX=clang++ CC=clang  \
        && mkdir ct && cd ct \
        && gclient config --name="certificate-transparency" https://github.com/google/certificate-transparency.git@master \
        && gclient sync --disable-syntax-validation \
        && make -C certificate-transparency check

直接docker build -t ctlog .

然后你就可以去喝杯茶了。不出意外,大概1个小时左右,你会看到

Testsuite summary for certificate-transparency 0.9
============================================================================
# TOTAL: 41
# PASS:  41
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
...

之后,我们进docker将编译好的文件映射出来即可。

ct/certificate-transparency 文件夹拷出后,我们大概可以看到:

# certificate-transparency git:(master) tree
.
├── AUTHORS
├── Dockerfile
├── ...
├── cloud
│   ├── etcd
│   │   └── Dockerfile
│   └── prometheus
│       ├── Dockerfile
│       └── prometheus.conf
├── cpp
│   ├── server
│   │   ├── ct-mirror
│   │   ├── ct-server
│   ├── tools
│   │   ├── ct-clustertool
│   │   └── prepare_etcd.sh
└── ...

这里的ct-server就是我们要的可执行文件了。除了该文件外,我们还需要一些工具,脚本,如:etcd初始化脚本prepare_etcd.sh和CT集群工具ct-clustertool。到这里,我们的编译工作就完成了。

3)构建与编排

文档上说的很清楚,编排之前我们还需要一些文件,至于具体需要哪些,我们结合ct-server参数做一个大概了解。

  1. 必须参数
    • --key=<pemfile> 秘钥PEM文件,ct日志服务用来加密和签名的。无需密码保护。
    • --trusted_cert_file=<pemfile> 可信CA PEM文件,你的日志可接收的可信CA。
    • --leveldb_db=<file>.ldb 日志文件数据库。
    • --etcd_servers=<host>:<port>,<host>:<port>,... etcd服务。
    • --server=<hostname> 主机名。(可解析 可路由)
    • --port=<port> 端口。
  2. 可选参数
    • -log_dir=<dir> 日志文件夹
    • --v=<num> 日志输出等级 (像debug一样)
    • --monitoring=<prometheus|gcm> 监控
    • --tree_signing_frequency_seconds=<secs> STH树的刷新时间 « MMD
    • --guard_window_seconds=<secs> 表示在对日志的新条目进行排序之前要拖延多长时间.
    • --etcd_delete_concurrency=<num> 表示可以同时删除多少个etcd条目。
    • --num_http_server_threads=<num> 表示有多少线程用于服务传入的HTTP请求。

从参数可以看出,我们需要

私钥

# openssl 生成
openssl ecparam -name prime256v1 > privkey.pem # 生成参数文件
openssl ecparam -in privkey.pem -genkey -noout >> privkey.pem # 生成key
openssl ec -in privkey.pem -noout -text # 查看key
openssl ec -in privkey.pem -pubout -out pubkey.pem # 生成公钥

CA证书

文档上提供的是从Ubuntn的根证书库拿证书,我们也这么做,不过如果你想向Google提交你的日志服务,你还需要内置一章Google的测试证书,供Google测试使用。

sudo apt-get install -qy ca-certificates
sudo update-ca-certificates
cat /etc/ssl/certs/* > ca-roots.pem

etcd

etcd我用的quay.io/coreos/etcd:v3.2.0镜像,用DISCOVERY模式。

prometheus

刚开始我也用的是最新版本的prometheus,但当我启动后,发现ct_server中/mertic获取到的数据居然无法兼容,我最后还是用了v1.0.0版。

在这些都开始后我们就开始构建镜像,编排docker了,相关的Dockerfile及文件我都上传到了我的GitHub,其中为了方便操作,我用Makefile编排了一下。

CURRENT_DIR=`pwd`

help:
	@echo "docker build help..."
	@docker build -f Dockerfile-help -t ct_help .

# 用于日志的key
pre_key:
	@openssl ecparam -name prime256v1 > server-key.pem  && \
	    openssl ecparam -in server-key.pem -genkey -noout >> server-key.pem  && \
	    openssl ec -in server-key.pem -noout -text  && \
	    openssl ec -in server-key.pem -pubout -out server-pub.pem 

# 根证书
pre_cacerts:
	@docker run --rm -v $(CURRENT_DIR):/tmp -it ct_help bash -c '\
	    cat /etc/ssl/certs/* /tmp/google_test.pem > /tmp/ca-cert.pem'

prom:  
	@echo "docker build promtheus..."
	@docker build -f Dockerfile-prom -t ct_prom .
	
ct_log:
	@echo "docker build ct log..."
	@docker build -f Dockerfile-log -t ct_log .

etcd:
	@echo "docker build etcd ..."
	@docker build -f Dockerfile-etcd -t ct_etcd .
	
up:
	@export ETCD_DISCOVERY=`curl -s -w "\n" 'https://discovery.etcd.io/new?size=3'` && \
	    printf "\033[92m[%-14s]\033[0m %s\n" "etcd discovery" $$ETCD_DISCOVERY && \
	    docker-compose up -d

# 启动后需要初始化etcd内的内容
init_etcd:
	@docker run --rm -v $(CURRENT_DIR):/tmp \
	    --add-host "etcdhost:192.168.11.65" -t ct_help bash -c '\
	    cd /tmp && ./prepare_etcd.sh etcdhost 14001 server-key.pem'

# 停止
down:
	@docker-compose down
	
# 清除日志文件
clean_data:
	@rm -rf /mnt/data/ct

# 测试
test:
	curl -s 127.0.0.1:18081/ct/v1/get-sth 
	#
	curl -s 127.0.0.1:18082/ct/v1/get-sth 
	#
	curl -s 127.0.0.1:18083/ct/v1/get-sth 

submit:
	@docker run --rm -v $(CURRENT_DIR):/tmp \
	    --add-host "host:192.168.11.65" -t ct_help bash -c '\
	    cd /tmp && ./ct-submit host:18081 < test_full_chain.pem > test.sct'

check_etcd:
	curl -s -L http://127.0.0.1:14001/health
	#
	curl -s -L http://127.0.0.1:14002/health
	#
	curl -s -L http://127.0.0.1:14003/health

pre: help pre_key pre_cacerts

build: prom ct_log etcd

run: up init_etcd

只需要简单的make pre build run你就可以搭建起一个CT日志服务了,不过在此之前不要忘了将Makefile,prometheus.yaml,docker-compose.yaml中的IP改成你的哦。

4)部署与测试

其实按照上面操作你已经搭建起了一个CT日志服务。

  • make pre 准备了一个后面需要的Ubuntu docker,生成秘钥以及根证书。
  • make build 将需要的容器构建。
  • make run就是启动以及向ETCD写入一些日志相关的Key以及CT集群的一些初始化工作,具体内容可看prepare_etcd.sh脚本。

在这之后,make test我们可以看到:

$ curl -s 127.0.0.1:18081/ct/v1/get-sth
{ "tree_size": 0, "timestamp": 1515742224849, "sha256_root_hash": "47DEQpj8HBSa+\/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", "tree_head_signature": "BAMARzBFAiEAimYSepMbRdR5cTCo9OwW3m3w7fQPIuO1L0LPC+7NaUgCIGNcLLwehMMckj\/\/tGAJfEFPOYiWTGuM+jno87XK6RwT" }#
$ curl -s 127.0.0.1:18082/ct/v1/get-sth
{ "tree_size": 0, "timestamp": 1515742224849, "sha256_root_hash": "47DEQpj8HBSa+\/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", "tree_head_signature": "BAMARzBFAiEAimYSepMbRdR5cTCo9OwW3m3w7fQPIuO1L0LPC+7NaUgCIGNcLLwehMMckj\/\/tGAJfEFPOYiWTGuM+jno87XK6RwT" }#
$ curl -s 127.0.0.1:18083/ct/v1/get-sth
{ "tree_size": 0, "timestamp": 1515742224849, "sha256_root_hash": "47DEQpj8HBSa+\/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", "tree_head_signature": "BAMARzBFAiEAimYSepMbRdR5cTCo9OwW3m3w7fQPIuO1L0LPC+7NaUgCIGNcLLwehMMckj\/\/tGAJfEFPOYiWTGuM+jno87XK6RwT" }% 

说明第一棵大小为0,时间戳为1515742224849的树已经建好了,CT等着我们去提交了。

接下来,我们提交一张证书测试一下。

make submit 提交了一张我已经准备好的证书,返回的SCT写入到了test.sct文件。

$ xxd test.sct
00000000: 00e8 03a0 42ca d5c6 8b75 dd99 7618 a739  ....B....u..v..9
00000010: b365 a64b 1bc3 4fa3 6f10 1169 dd0b 4c48  .e.K..O.o..i..LH
00000020: 9400 0001 60e9 4672 9f00 0004 0300 4830  ....`.Fr......H0
00000030: 4602 2100 a6c2 3520 9cd0 c5cc 9549 7db3  F.!...5 .....I}.
00000040: 97a1 702a c2f9 8c7c 566d 3f2a 0124 a5c6  ..p*...|Vm?*.$..
00000050: edfa 709a 0221 00da 9fb9 b301 6bf1 873f  ..p..!......k..?
00000060: bc75 7c5a f25c 13f7 f3ad dddd ec5a 017b  .u|Z.\.......Z.{
00000070: 25de 4de2 452f 44                        %.M.E/D

我们的一张证书已经成功提交到自己CT日志服务。大概在40s之后,也就是--tree_signing_frequency_seconds加上--guard_window_seconds的时间过后,一个新树就生成了。再次make test

$ curl -s 127.0.0.1:18081/ct/v1/get-sth
{ "tree_size": 1, "timestamp": 1515742344849, "sha256_root_hash": "pI7dv4Bi3dyBvx83s13fuWbNwGQQmafY344Wyf0m7OI=", "tree_head_signature": "BAMASDBGAiEAmVi6bsH3+NMxaiapBXA80Ygolc1kGLgPAhSMUEXcCzoCIQDdB4YdxH08lmeIZ8DDttjPtm5NtZV8CCNZ1+xyT0d05A==" }#
$ curl -s 127.0.0.1:18082/ct/v1/get-sth
{ "tree_size": 1, "timestamp": 1515742344849, "sha256_root_hash": "pI7dv4Bi3dyBvx83s13fuWbNwGQQmafY344Wyf0m7OI=", "tree_head_signature": "BAMASDBGAiEAmVi6bsH3+NMxaiapBXA80Ygolc1kGLgPAhSMUEXcCzoCIQDdB4YdxH08lmeIZ8DDttjPtm5NtZV8CCNZ1+xyT0d05A==" }#
$ curl -s 127.0.0.1:18083/ct/v1/get-sth
{ "tree_size": 1, "timestamp": 1515742344849, "sha256_root_hash": "pI7dv4Bi3dyBvx83s13fuWbNwGQQmafY344Wyf0m7OI=", "tree_head_signature": "BAMASDBGAiEAmVi6bsH3+NMxaiapBXA80Ygolc1kGLgPAhSMUEXcCzoCIQDdB4YdxH08lmeIZ8DDttjPtm5NtZV8CCNZ1+xyT0d05A==" }% 

这颗 Merkle树已经包含了我提交的证书。

哦,还漏了一点,我们可以从prometheus看到所有的服务,也可以制造一些数据报表,设置报警规则等。

问题

一切似乎进展的很顺利,但,当我上云时,问题出现了。

三台机器,私网全部流量互通,每个机器一个CT已经etcd服务,节点三多跑一个Prometheus服务。当我将一切搭建好后,向其中一个节点提交日志,我们会发现除主简单外,其他两个节点日志打印错误如下:

I1228 09:30:09.295418     8 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.295658    10 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.332808    13 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.333170    14 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.333434    12 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.333684     9 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.333931    11 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.334175    15 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.334420     8 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.334666    10 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:
I1228 09:30:09.334946    13 fetcher.cc:225] error fetching entries at index 0: UNKNOWN:

同时,这两个节点CPU用量会飙升。

当然,在CT项目的Issues里我们发现了有人遇到了几乎同样的问题。在最后一句大神的回复中,我们或了解到,他们正在开发一个通用的透明化项目Trillian,当然该项目不仅仅可以用于证书透明化。借助于Merkle树的快速查询,不可修改等特性未来或许我们会在更多地方看到他。

这让我想到区块链,想到前几天图大发的一个推

emmmmm… 扯远了,到这里全部的搭建过程完成了,最后虽未成功,但发现了一个新的方向~

当然,如果你解决了这个问题,或者发现了我的错误,还望不吝指教~