google/certificate-transparency-go
GitHub: google/certificate-transparency-go
Google 出品的证书透明度协议 Go 实现,提供 CT 日志的客户端访问、数据结构处理、日志扫描及基于 Trillian 的日志部署能力。
Stars: 1146 | Forks: 313
# 证书透明度:Go 代码
[](https://goreportcard.com/report/github.com/google/certificate-transparency-go)
[](https://godoc.org/github.com/google/certificate-transparency-go)

本代码库包含与 [证书透明度](https://www.certificate-transparency.org/) (CT) 相关的 Go 代码。该代码库需要 Go 1.24 版本。
- [代码库结构](#repository-structure)
- [Trillian CT Personality](#trillian-ct-personality)
- [参与代码开发](#working-on-the-code)
- [运行代码库检查](#running-codebase-checks)
- [重新生成代码](#rebuilding-generated-code)
## 代码库结构
代码库的主要部分包括:
- 编码库:
- `asn1/` 和 `x509/` 是上游 Go `encoding/asn1` 和 `crypto/x509` 库的分支 (fork)。我们维护这些包的独立分支,因为 CT 旨在作为整个生态系统证书的观察站;因此,我们需要能够处理一些格式错误的证书,而更严格的上游代码会(正确地)拒绝这些证书。
我们的 `x509` 分支还包含了用于处理 [RFC 6962 中定义的预证书](https://tools.ietf.org/html/rfc6962#section-3.1) 的代码。
- `tls` 包含一个用于处理 [RFC 5246](https://tools.ietf.org/html/rfc5246) 中描述的 TLS 编码数据的库。
- `x509util/` 提供了处理 `x509.Certificate` 的额外工具。
- CT 客户端库:
- 顶层 `ct` 包(位于 `.` 中)包含用于处理 [RFC 6962](https://tools.ietf.org/html/rfc6962) 中定义的 CT 数据结构的类型和工具。
- `client/` 和 `jsonclient/` 包含的库允许通过 [RFC 6962 第 4 节](https://tools.ietf.org/html/rfc6962#section-4) 中描述的 HTTP 入口点访问 CT 日志。
- `dnsclient/` 包含一个允许通过 [DNS](https://github.com/google/certificate-transparency-rfcs/blob/master/dns/draft-ct-over-dns.md) 访问 CT 日志的库。
- `scanner/` 包含一个用于扫描现有 CT 日志全部内容的库。
- [Trillian](https://github.com/google/trillian) 的 CT Personality:
- `trillian/` 包含的代码允许使用 Trillian 日志作为后端来运行证书透明度日志 —— 参见 [下文](#trillian-ct-personality)。
- 命令行工具:
- `./client/ctclient` 允许与 CT 日志进行交互。
- `./ctutil/sctcheck` 允许验证来自 CT 日志的 SCT(签名证书时间戳)。
- `./scanner/scanlog` 允许扫描现有的 CT 日志以查找感兴趣的证书;在对日志运行此工具时请注意规范操作。
- `./x509util/certcheck` 允许显示和验证证书。
- `./x509util/crlcheck` 允许显示和验证证书吊销列表 (CRL)。
- 其他与 CT 相关的库:
- `ctutil/` 包含用于验证和校验 CT 数据结构的实用函数。
- `loglist3/` 包含一个用于读取 [v3 JSON 格式的 CT 日志列表](https://groups.google.com/a/chromium.org/g/ct-policy/c/IdbrdAcDQto/m/i5KPyzYwBAAJ) 的库。
## Trillian CT Personality
`trillian/` 子目录包含用于运行基于 [Trillian](https://github.com/google/trillian) 通用透明度日志的 CT 日志的代码和脚本,其[文档单独提供](trillian/README.md)。
## 参与代码开发
想要对代码库进行更改的开发者需要一些额外的依赖项和工具,这将在以下章节中进行说明。
### 运行代码库检查
[`scripts/presubmit.sh`](scripts/presubmit.sh) 脚本会在代码库上运行各种工具和测试;在提交 pull request 请求审核之前,请确保此脚本运行通过。
```
# 安装 golangci-lint
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6
# 运行 code generation、build、test 和 linters
./scripts/presubmit.sh
# 运行 build、test 和 linters,但跳过 code generation
./scripts/presubmit.sh --no-generate
# 或者只单独运行 linters:
golangci-lint run
```
### 重新生成代码
部分 CT Go 代码是根据其他文件自动生成的:
- [Protocol buffer](https://developers.google.com/protocol-buffers/) 消息定义被转换为 `.pb.go` 实现。
- Trillian gRPC API 的模拟实现(位于 `trillian/mockclient` 中)是使用 [GoMock](https://github.com/golang/mock) 创建的。
- 一些枚举具有使用 [stringer](https://godoc.org/golang.org/x/tools/cmd/stringer) 工具(`go get
golang.org/x/tools/cmd/stringer`)创建的字符串转换方法(满足 `fmt.Stringer` 接口)。
只有在更改原始文件时,才需要重新生成 mock 或 protobuffer 文件。推荐的方法是使用 Cloud Build 所使用的 Docker 镜像:
```
docker build -f ./integration/Dockerfile -t ctgo-builder .
docker run -it --mount type=bind,src="$(pwd)",target=/src ctgo-builder /bin/bash -c "cd /src; ./scripts/install_deps.sh; go generate -x ./..."
```
这些命令首先根据本代码库中的 Dockerfile 创建一个 Docker 镜像,然后基于该镜像启动一个容器并挂载本地目录。系统会使用本代码库中的 `go.mod` 文件确定正确的工具版本,并安装这些工具。最后,所有生成的文件都会被重新生成,随后 Docker 退出。
或者,您也可以在本地安装这些先决条件:
- 一系列工具,使用 `go install` 安装以确保版本兼容且经过测试:
cd $(go list -f '{{ .Dir }}' github.com/google/certificate-transparency-go); \
go install github.com/golang/mock/mockgen; \
go install google.golang.org/protobuf/proto; \
go install google.golang.org/protobuf/cmd/protoc-gen-go; \
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc; \
go install github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc; \
go install golang.org/x/tools/cmd/stringer
- `protoc` 工具:您需要安装 [3.20.1 版本](https://github.com/protocolbuffers/protobuf/releases/tag/v3.20.1),并更新 `PATH` 以包含其 `bin/` 目录。
然后运行以下命令:
```
go generate -x ./... # hunts for //go:generate comments and runs them
```
标签:EVTX分析, Go, Python工具, Ruby工具, TLS证书, 基础组件, 密码学, 手动系统调用, 日志审计, 证书透明度, 请求拦截