nginx 不支持证书透明度(ct)日志检查,因其 tls 实现(如 openssl)仅负责握手与加密,不包含 ct 日志查询、sct 解析验证或强制策略引擎;它只能传递 sct 供浏览器端校验。

SSL 证书透明度(Certificate Transparency, CT)日志检查不是由 Nginx 原生支持的功能,Nginx 本身 不提供 CT 日志验证或强制检查能力。它仅能配置 HTTPS(启用 SSL/TLS),但无法主动查询 CT 日志、验证证书是否已被记录,或拒绝未记录的证书。
为什么 Nginx 不能做 CT 日志检查?
Nginx 是一个反向代理和 Web 服务器,其 TLS 实现(通常基于 OpenSSL)负责握手和加密,但不包含:
- CT 日志查询逻辑(如连接 Google’s AVA、Cloudflare’s Nimbus 等公共 CT 日志)
- 证书 SCT(Signed Certificate Timestamp)解析与验证机制
- 强制要求客户端证书携带有效 SCT 或拒绝无 SCT 的证书的策略引擎
实际可行的 CT 相关配置(Nginx 可做的部分)
Nginx 能配合 CT 生态,仅限于 传递 SCT 信息给浏览器,让浏览器自行执行 CT 检查(这是主流做法)。关键操作是:将 SCT 嵌入证书或通过 TLS 扩展(OCSP Stapling + SCT extension)发送。
- 使用已嵌入 SCT 的证书:由支持 CT 的 CA(如 Let’s Encrypt、Sectigo、DigiCert)签发时,可选择开启 SCT 嵌入(例如 Certbot 默认启用 --staple-ocsp 和自动获取 SCT)
- 配置 OCSP Stapling(推荐启用):虽然 OCSP 本身不等于 CT,但现代 CA 在 stapled OCSP 响应中常附带 SCT 列表(依赖 OpenSSL 1.1.1+ 和 nginx 1.15.0+)
- 确保 TLS 配置支持扩展:Nginx 无需额外指令,只要使用较新版本 + 支持 TLS 1.2/1.3 的 OpenSSL,就能在 ServerHello 中发送 SCT(若证书或 stapled 响应中存在)
如何验证 SCT 是否生效?
部署后,用以下方式确认浏览器收到了 SCT:
- Chrome 访问站点 → 地址栏点击锁图标 → “连接是安全的” → “证书” → 查看“证书透明度”部分是否有“已记录”状态
- 命令行检测:
openssl s_client -connect example.com:443 -servername example.com -ct 2>/dev/null | grep -i "signed certificate"(需 OpenSSL 支持 -ct 参数) - 在线工具:https://crt.sh/?q=example.com 或 https://www.ssllabs.com/ssltest/
真正需要 CT 强制检查?得换方案
如业务合规要求(如金融行业)必须拦截未记录证书,Nginx 不适合单独承担该职责。可行路径包括:
- 前置网关层检查:用 Envoy、Traefik(支持 Lua 或外部授权插件)或自研 TLS 终止服务,在握手阶段调用 CT 日志 API 校验 SCT 有效性
-
客户端强制策略:在 Chrome/Edge 等浏览器中通过组策略(Enterprise)启用
RequireCertificateTransparency,由客户端执行验证 - 证书签发阶段控制:只接受来自已知可信 CT 日志(如 Google、Cloudflare)的 SCT 的证书,人工或脚本校验后再部署到 Nginx
不复杂但容易忽略:CT 是端到端信任链的一环,Nginx 是终点,不是审查员。把它配对好证书和 OCSP,把 SCT 传出去,剩下的交给浏览器和日志系统。











