合规检查
合规检查回答:"这张证书 / 这个 CA 配置是否符合 RFC 与 CA/Browser Forum 基线要求?" 与安全分析的区别:合规看规则符合性,安全分析看风险评分。
八项合规能力
| 命令 | 检查什么 | 规范 | 在线/离线 |
|---|---|---|---|
check-key-usage | 密钥用法扩展 | RFC 5280 + CA/B BR | 域名/文件 |
check-serial-entropy | 序列号熵 ≥64 bit | CA/B BR | 域名/文件 |
check-policy | DV/OV/EV 分类 | 策略 OID | 域名/文件 |
check-name-constraints | CA 名称约束 | RFC 5280 | 链文件 |
check-distrusted-ca | 含不可信 CA | 浏览器根存储 | 链文件 |
check-sct | SCT 证书透明度 | CA/B BR | 域名 |
check-ocsp-must-staple | OCSP Must-Staple | RFC 7633 | 域名 |
check-caa | CAA 记录 | RFC 6844 | 域名 |
CI 离线合规审计
前四项(key-usage / serial-entropy / policy / name-constraints)+ distrusted-ca 都有离线文件模式,CI 里可直接对一批证书文件跑合规审计,零网络依赖。
密钥用法(KeyUsage)
RFC 5280 规定了四条硬规则:
cert-skills check-key-usage example.com
cert-skills check-key-usage ./server.pem # 离线序列号熵
CA/Browser Forum 要求证书序列号至少 64 位熵,且不可顺序可预测(防碰撞与预生成攻击)。
cert-skills check-serial-entropy example.compkg 内部对序列号做:位长检查 + Shannon 熵计算 + 顺序可预测性检测。低于阈值即告警。
DV / OV / EV 分类
证书按身份验证严格度分三档,由策略 OID标识:
| 类型 | 验证内容 | 典型 OID |
|---|---|---|
| DV (Domain Validation) | 仅域名所有权 | 2.23.140.1.2.1 |
| OV (Organization Validation) | 组织身份 | 2.23.140.1.2.2 |
| EV (Extended Validation) | 严格组织+法律审核 | 2.23.140.1.1 等 |
cert-skills check-policy example.com
cert-skills check-policy ./server.pemdetect-ev 是其简化版,专门判 EV(浏览器地址栏曾显示组织名)。
Name Constraints
CA 可以用 Name Constraints 扩展限制自己只能签发某些命名空间的证书——比如一个企业内部 CA 声明"我只签 *.corp.local"。
cert-skills check-name-constraints ./chain.pem # 离线,需整链检查叶子证书的域名是否落在父 CA 的 permitted 内、不在 excluded 内。详见 18 项证书检查 的 CERT-018。
不可信 CA 检测
浏览器会定期把被攻陷或违规的 CA 从根存储移除(DigiNotar、WoSign、StartCom、Symantec legacy、CNNIC、TrustCor、DarkMatter…)。你的证书链里如果还挂着这些 CA 签发的证书,就是大问题。
cert-skills check-distrusted-ca example.com
cert-skills check-distrusted-ca ./chain.pem # 离线matchDistrustedCA 比对内置清单,记录违规 CA 在链中的位置。
SCT(证书透明度)
CA/Browser Forum 要求公开可信证书必须包含 SCT(Signed Certificate Timestamp)——证明这张证书已被记入 CT 日志,可被独立审计。
cert-skills check-sct example.com检查 SCT 数量是否满足要求(通常 ≥2)。缺 SCT 说明可能未合规或漏报 CT。
OCSP Must-Staple
RFC 7633 的 Must-Staple 扩展声明:"这张证书必须附带 OCSP Staple 才算有效"。
cert-skills check-ocsp-must-staple example.com带 Must-Staple 但不提供 Staple 会导致合规客户端直接拒绝连接——部署前必须确认 stapling 配置就绪。
CAA 记录
DNS CAA(RFC 6844)让域名所有者声明"只允许哪些 CA 给我签证书"。
cert-skills check-caa example.com判定逻辑:从证书 Issuer 抽 CA 名 → 查域名 CAA issue 记录 → 比对是否授权。无 issue 记录 = 任意 CA 可签 = 合规但宽松;issue ";" = 禁止任何 CA。底层手搓 UDP DNS 报文(Go 标准库不支持 CAA),详见 CAA 与 DNS。
合规审计工作流
把八项串成一次 CI 审计:
for cert in ./certs/*.pem; do
echo "=== $cert ==="
cert-skills check-key-usage "$cert"
cert-skills check-serial-entropy "$cert"
cert-skills check-policy "$cert"
cert-skills check-distrusted-ca "$cert"
done哪项合规检查对应哪类风险: