d-Rickyy-b/certstream-server-go

GitHub: d-Rickyy-b/certstream-server-go

一款用 Go 编写的证书透明度日志流式聚合服务器,可作为 Calidog certstream 的轻量级自托管替代方案。

Stars: 198 | Forks: 37

![certstream-server-go logo](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/cd5042f99b084028.png) # Certstream Server Go [![build](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/740e6f22e5084029.svg)](https://github.com/d-Rickyy-b/certstream-server-go/actions/workflows/release_build.yml) [![Docker Image Version (latest semver)](https://img.shields.io/docker/v/0rickyy0/certstream-server-go?label=docker&sort=semver)](https://hub.docker.com/repository/docker/0rickyy0/certstream-server-go) [![Go Reference](https://pkg.go.dev/badge/github.com/d-Rickyy-b/certstream-server-go.svg)](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)。 ![grafana dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/377e126081084032.png) ### 示例 要接收任何端点的实时示例,请向端点发送 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, 二进制发布, 依赖分析, 信息安全, 域名监控, 安全防御评估, 开源工具, 数据聚合, 日志审计, 替代方案, 网络安全, 自定义请求头, 证书透明度, 请求拦截, 隐私保护