d-Rickyy-b/certstream-server-go
GitHub: d-Rickyy-b/certstream-server-go
一款用 Go 编写的证书透明度日志流式聚合服务器,可作为 Calidog certstream 的轻量级自托管替代方案。
Stars: 198 | Forks: 37

# Certstream Server Go
[](https://github.com/d-Rickyy-b/certstream-server-go/actions/workflows/release_build.yml)
[](https://hub.docker.com/repository/docker/0rickyy0/certstream-server-go)
[](https://pkg.go.dev/github.com/d-Rickyy-b/certstream-server-go)
本项目旨在成为 Calidog 开发的 [certstream server](https://github.com/CaliDog/certstream-server/) 的直接替代品。该工具通过 websocket 连接,聚合、解析并将来自多个[证书透明度日志](https://www.certificate-transparency.org/what-is-ct)的证书数据流式传输给客户端。
每个人都可以使用该项目来分析新颁发的 TLS 证书。
## 动机
从我第一次了解证书透明度日志那一刻起,我就对 [Calidog](https://github.com/CaliDog/) 的优秀软件感到惊讶,它让每个人都能更轻松地访问透明度日志。
他们的软件“Certstream”解析日志并以一种易于使用的格式提供:JSON。
在创建了我的第一个利用 certstream server 的应用程序后,我发现托管(演示)版本的服务器并不像我想象的那样可靠。
我经常遇到断开连接的情况,有时还会出现其他错误。最终,我发现提供的服务器仍然被认为只是一个 **demo**。
我很快想到了运行自己的 certstream 实例。但我不想在我的服务器上安装 Elixir/Erlang。当然,我可以使用 Docker,但再三考虑后,我非常想用 Go 编写一个替代服务器。
你可能会问:“为什么是 Go?”。因为它是一门很棒的语言,可以在所有主要架构和操作系统上编译成本地二进制文件。现在所有酷小孩都在用它。
## 快速开始
设置 certstream server 实例非常简单。你可以下载并自己编译代码,或者使用其中一个[预编译二进制文件](https://github.com/d-Rickyy-b/certstream-server-go/releases)。
默认情况下,certstream-server-go 将监控 [Google Log list](https://www.gstatic.com/ct/log_list/v3/log_list.json) 中列出的所有日志,这些日志也包含在 Chrome 浏览器中。除了那里列出的日志外,还有更多的 CT 日志可用。Google 提供了[另一个包含所有已知 CT 日志的列表](https://www.gstatic.com/ct/log_list/v3/all_logs_list.json)。但并非所有日志都与你相关。或者也许你正在运行自己的 CT 日志并且也想监控它?
你可以在配置文件中定义额外的日志。查看[示例配置文件](https://github.com/d-Rickyy-b/certstream-server-go/blob/master/config.sample.yaml)
### Docker
还有一个预构建的 [Docker 镜像](https://hub.docker.com/repository/docker/0rickyy0/certstream-server-go)可用。
你可以通过运行以下命令来使用它:
`docker run -d -v /path/to/config.yaml:/app/config.yaml -p 8080:8080 0rickyy0/certstream-server-go`
## 连接
certstream-server-go 提供多个端点供连接。
| Config | Default | Function |
|--------------------|-----------------|-------------------------------------------------------------------------------------------|
| `full_url` | `/full-stream` | 包含所有可用详细信息的新证书持续流 |
| `lite_url` | `/` | 包含简化详细信息的新证书持续流(无 `as_der` 和 `chain` 字段) |
| `domains_only_url` | `/domains-only` | 新证书中发现的域名持续流 |
你可以通过向上述任何一个端点打开 **websocket 连接**来连接到 certstream-server。
连接后,证书信息将被流式传输到你的 websocket。
服务器要求你至少每 60 秒发送一次 **ping 消息**(建议使用 30 秒的间隔进行 ping)。
如果服务器在超过此时间内未收到 ping 消息,它将断开你的连接。
服务器 **不会** 向你的客户端发送 ping 消息。
在 [Mozilla Developer Docs](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#pings_and_pongs_the_heartbeat_of_websockets) 中阅读更多关于 ping/pong WebSocket 消息的信息。
### 性能
在空闲状态下(无客户端连接),服务器使用约 **40 MB** 内存、**14.5 Mbit/s** 带宽和平均 **4–10% CPU**(Oracle Free Tier),同时每秒处理约 **250–300 个证书**。
### 网络注意事项
此工具需要出站访问公网,以连接到 [Google Log list](https://www.gstatic.com/ct/log_list/v3/log_list.json) 和 CT 日志本身。
因此,如果你碰巧在企业环境(例如,在代理/防火墙后)中使用此工具,请确保允许到 gstatic.com 和你想要连接的 CT 日志的出站连接。
如果你计划从本地网络外部将客户端连接到服务器,请确保允许连接到你在配置文件中配置的端口的传入连接(webserver.listen_port)。
### 监控
**certstream-server-go** 还在 `/metrics` 提供 Prometheus 指标端点。你可以使用它通过 Prometheus 和 Grafana 监控服务器。
有关如何执行此操作的深入指南,请参阅 [wiki](https://github.com/d-Rickyy-b/certstream-server-go/wiki/Collecting-and-Visualizing-Metrics)。

### 示例
要接收任何端点的实时示例,请向端点发送 HTTP GET 请求,并在端点后附加 `/example.json`。
例如:`/full-stream/example.json`。这显示了证书更新的 lite 格式。
```
{
"data": {
"cert_index": 712420366,
"cert_link": "https://yeti2022-2.ct.digicert.com/log/ct/v1/get-entries?start=712420366&end=712420366",
"leaf_cert": {
"all_domains": [
"cmslieferhit.e06.k-k.de"
],
"extensions": {
"authorityInfoAccess": "URI:http://r3.i.lencr.org/, URI:http://r3.o.lencr.org",
"authorityKeyIdentifier": "keyid:14:2e:b3:17:b7:58:56:cb:ae:50:09:40:e6:1f:af:9d:8b:14:c2:c6",
"basicConstraints": "CA:FALSE",
"keyUsage": "Digital Signature, Key Encipherment",
"subjectAltName": "DNS:cmslieferhit.e06.k-k.de",
"subjectKeyIdentifier": "keyid:4e:cb:ae:47:84:a8:92:f7:e7:de:78:d1:00:9e:d9:cc:80:ac:0b:ce"
},
"fingerprint": "27:58:3D:01:3D:71:B8:D3:A6:6E:2C:7A:86:3A:E9:1F:DB:F0:1B:5D",
"sha1": "27:58:3D:01:3D:71:B8:D3:A6:6E:2C:7A:86:3A:E9:1F:DB:F0:1B:5D",
"sha256": "57:61:38:C0:3C:03:A3:34:6A:0B:32:89:11:1B:74:AB:8A:DF:A5:02:9F:06:43:E6:F3:0E:69:F3:0E:4E:4E:FC",
"not_after": 1667028404,
"not_before": 1659252405,
"serial_number": "0498BDF812FAF923FEBD5EF7B374899FC61A",
"signature_algorithm": "sha256, rsa",
"subject": {
"C": null,
"CN": "cmslieferhit.e06.k-k.de",
"L": null,
"O": null,
"OU": null,
"ST": null,
"aggregated": "/CN=cmslieferhit.e06.k-k.de",
"email_address": null
},
"issuer": {
"C": "US",
"CN": "R3",
"L": null,
"O": "Let's Encrypt",
"OU": null,
"ST": null,
"aggregated": "/C=US/CN=R3/O=Let's Encrypt",
"email_address": null
},
"is_ca": false
},
"seen": 1659301203.904,
"source": {
"name": "DigiCert Yeti2022-2 Log",
"url": "https://yeti2022-2.ct.digicert.com/log"
},
"update_type": "PrecertLogEntry"
},
"message_type": "certificate_update"
}
```
标签:Certstream, CT Logs, Docker, EVTX分析, Go, meg, Ruby工具, TLS 证书, WebSocket, 二进制发布, 依赖分析, 信息安全, 域名监控, 安全防御评估, 开源工具, 数据聚合, 日志审计, 替代方案, 网络安全, 自定义请求头, 证书透明度, 请求拦截, 隐私保护