Skip to content

原始证书与 add-chain

这两个方法处理证书的裸材料:取 PEM 原文,以及为 CT 提交构造 add-chain JSON。

FetchRawCertificateGenerateAddChainJSON?d= 端点唯一 POST 方法

FetchRawCertificate:取 PEM

go
pem, _ := client.FetchRawCertificate(ctx, 12345)
// pem = "-----BEGIN CERTIFICATE-----\n..."

端点是 ?d=id——crt.sh 的"下载"链接。SDK 拿到后做一项校验:响应必须以 -----BEGIN CERTIFICATE----- 开头,否则报 parse 错误。

flowchart LR ID["crt.sh ID"] --> D["GET crt.sh?d=12345"] D --> BODY["响应体"] BODY --> TRIM["TrimSpace"] TRIM --> CK{以 BEGIN CERTIFICATE 开头?} CK -->|否| ERR["ParseError"] CK -->|是| PEM["返回 PEM string"]

拿到 PEM 后可以直接喂 openssl:

取 PEM 并用 openssl 解析
$ crtsh-cli get-raw-cert 12345 | openssl x509 -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: ...
Signature Algorithm: sha256WithRSAEncryption
✓ PEM 有效

GenerateAddChainJSON:构造 CT 提交负载

CT 日志的 /add-chain 接口需要特定 JSON 结构。crt.sh 提供一个助手页 /gen-add-chain:贴入 PEM,它返回可提交给 CT 日志的 JSON。

SDK 里唯一的 POST 方法

其余都是 GET。Content-Type: application/x-www-form-urlencoded,表单字段名 b64cert

flowchart TD PEM["PEM 证书串"] --> V["非空校验"] V --> POST["POST crt.sh/gen-add-chain
form: b64cert=PEM"] POST --> BODY["JSON 响应体"] BODY --> VJ["json.Valid 校验"] VJ --> OUT["返回 JSON string"]
go
pemData := `-----BEGIN CERTIFICATE-----...`
addChainJSON, _ := client.GenerateAddChainJSON(ctx, pemData)
// addChainJSON 可直接 POST 给 CT 日志的 /add-chain

组合用法

🔍取证
FetchRawCertificate 拿 PEM,本地 openssl/cryptography 库做完整解析
📤重提交
把一张证书重新提交进 CT 日志做留痕——GenerateAddChainJSON 生成负载,再自己 POST 给日志
链路校验
取 PEM 后配合 FetchPathValidationView 做端到端路径校验