Skip to content

合规检查

合规检查回答:"这张证书 / 这个 CA 配置是否符合 RFC 与 CA/Browser Forum 基线要求?" 与安全分析的区别:合规看规则符合性,安全分析看风险评分

八项合规能力

命令检查什么规范在线/离线
check-key-usage密钥用法扩展RFC 5280 + CA/B BR域名/文件
check-serial-entropy序列号熵 ≥64 bitCA/B BR域名/文件
check-policyDV/OV/EV 分类策略 OID域名/文件
check-name-constraintsCA 名称约束RFC 5280链文件
check-distrusted-ca含不可信 CA浏览器根存储链文件
check-sctSCT 证书透明度CA/B BR域名
check-ocsp-must-stapleOCSP Must-StapleRFC 7633域名
check-caaCAA 记录RFC 6844域名

CI 离线合规审计

前四项(key-usage / serial-entropy / policy / name-constraints)+ distrusted-ca 都有离线文件模式,CI 里可直接对一批证书文件跑合规审计,零网络依赖。

密钥用法(KeyUsage)

RFC 5280 规定了四条硬规则:

bash
cert-skills check-key-usage example.com
cert-skills check-key-usage ./server.pem   # 离线

序列号熵

CA/Browser Forum 要求证书序列号至少 64 位熵,且不可顺序可预测(防碰撞与预生成攻击)。

bash
cert-skills check-serial-entropy example.com

pkg 内部对序列号做:位长检查 + 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
bash
cert-skills check-policy example.com
cert-skills check-policy ./server.pem

detect-ev 是其简化版,专门判 EV(浏览器地址栏曾显示组织名)。

Name Constraints

CA 可以用 Name Constraints 扩展限制自己只能签发某些命名空间的证书——比如一个企业内部 CA 声明"我只签 *.corp.local"。

bash
cert-skills check-name-constraints ./chain.pem   # 离线,需整链

检查叶子证书的域名是否落在父 CA 的 permitted 内、不在 excluded 内。详见 18 项证书检查 的 CERT-018。

不可信 CA 检测

浏览器会定期把被攻陷或违规的 CA 从根存储移除(DigiNotar、WoSign、StartCom、Symantec legacy、CNNIC、TrustCor、DarkMatter…)。你的证书链里如果还挂着这些 CA 签发的证书,就是大问题。

bash
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 日志,可被独立审计。

bash
cert-skills check-sct example.com

检查 SCT 数量是否满足要求(通常 ≥2)。缺 SCT 说明可能未合规或漏报 CT。

OCSP Must-Staple

RFC 7633 的 Must-Staple 扩展声明:"这张证书必须附带 OCSP Staple 才算有效"。

bash
cert-skills check-ocsp-must-staple example.com

带 Must-Staple 但不提供 Staple 会导致合规客户端直接拒绝连接——部署前必须确认 stapling 配置就绪。

CAA 记录

DNS CAA(RFC 6844)让域名所有者声明"只允许哪些 CA 给我签证书"。

bash
cert-skills check-caa example.com

判定逻辑:从证书 Issuer 抽 CA 名 → 查域名 CAA issue 记录 → 比对是否授权。无 issue 记录 = 任意 CA 可签 = 合规但宽松;issue ";" = 禁止任何 CA。底层手搓 UDP DNS 报文(Go 标准库不支持 CAA),详见 CAA 与 DNS

合规审计工作流

把八项串成一次 CI 审计:

bash
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

哪项合规检查对应哪类风险:

下一步