原始证书与 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:
$ crtsh-cli get-raw-cert 12345 | openssl x509 -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: ...
Signature Algorithm: sha256WithRSAEncryption
✓ PEM 有效
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"]
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 做端到端路径校验