apache 中需启用 mod_headers 模块,在全局 https 配置中用 header always set expect-ct "enforce, max-age=86400" 强制执行 ct 策略,证书须由支持 ct 的 ca 签发并含 sct。

要在 Apache 中通过 mod_headers 配置 Expect-CT 头部并强制执行证书透明度(CT)策略,关键在于正确启用模块、在合适位置设置响应头,并确保后端已部署符合 CT 要求的证书。
确认 mod_headers 已启用且配置位置正确
Expect-CT 必须在 HTTPS 响应中发送,且需对所有响应生效(包括重定向和错误页),因此不能放在 .htaccess 或仅限某个 <location></location> 块内。推荐做法是:
- 检查模块是否已加载:
a2enmod headers(Debian/Ubuntu)或确认httpd.conf中存在LoadModule headers_module modules/mod_headers.so - 将 Header 指令写在全局配置中,例如
/etc/httpd/conf.d/security-headers.conf,且必须位于所有<virtualhost></virtualhost>外部 - 使用
Header always set,避免被后续逻辑覆盖;不要用Header set
Expect-CT 头部的标准配置语法
强制执行 CT 策略的典型写法为:
Header always set Expect-CT "enforce, max-age=86400"
其中:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
enforce表示浏览器必须执行 CT 检查,不满足则拒绝连接(如证书未记录在公开 CT 日志中) -
max-age=86400表示该策略有效期为 24 小时,单位是秒;生产环境可设为2592000(30 天)或更长 - 不加
enforce(例如只写max-age=86400)表示仅报告模式,不会阻断连接
前置条件:确保证书支持证书透明度
Expect-CT 不是“开了就安全”的开关,它依赖实际证书是否满足 CT 要求:
- 证书必须由支持 CT 的 CA 签发(如 Let's Encrypt、DigiCert、Sectigo 等主流 CA 默认启用)
- 证书需包含 SCT(Signed Certificate Timestamp)扩展,通常由 CA 在签发时嵌入或通过 TLS 扩展传递
- 若使用自签名或私有 CA 证书,Expect-CT 将失效——因为这类证书几乎不可能进入公共 CT 日志
可选:配合 report-uri 实现违规监控
如需收集浏览器发现 CT 违规时的上报数据,可添加 report-uri 参数:
Header always set Expect-CT "enforce, max-age=86400, report-uri=\"https://o0.ingest.sentry.io/api/0/security/\""
注意:
- 上报地址必须是 HTTPS,且服务端需能接收并解析
application/json格式的 CT 违规报告 - 启用
report-uri后,即使未开启enforce,浏览器也会在检测到异常时发送报告 - Sentry 等监控平台支持解析此类报告,便于及时发现恶意证书或配置异常










