必须启用sslproxyverify require作为总开关,配合sslproxycacertificatefile指定可信ca、sslproxycheckpeername on和sslproxycheckpeerexpire on,四者缺一不可,否则证书链校验实际被跳过。
apache 中实现严格的证书链检查,核心不是“加开关”,而是完整构建可验证的信任链并启用全部校验环节。漏掉任一环节,都会导致看似配置了却实际跳过检查。
必须启用 SSLProxyVerify require
这是严格链检查的总开关,不启用它,后续所有校验(包括 CA 信任、签名、吊销、有效期)都无效:
- 仅设 SSLProxyVerify none 或不设,默认跳过全部证书校验
- SSLProxyVerify require 才会强制执行:证书链完整性、CA 签名有效性、CRL/OCSP 可选状态(需额外配置)、以及有效期和主机名匹配(后两者还需配合其他指令)
- 注意:它只在 SSLProxyEngine on 启用后才起作用,否则代理根本不会尝试建立 HTTPS 连接
指定可信 CA 证书文件(不能复用服务器证书)
Apache 不读系统 CA 仓库,必须显式提供后端所用根证书或完整信任链:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 使用 SSLProxyCACertificateFile 指向 PEM 格式的 CA 包(如
/etc/ssl/certs/backend-ca.crt) - 该文件必须只含可信根证书和中间证书,不能混入已过期的中间 CA —— 否则整条链校验失败,错误日志可能只显示 handshake failed
- 可用 OpenSSL 验证链是否有效:
openssl verify -CAfile backend-ca.crt backend-server.crt,返回 OK 才算合格
强制启用主机名与有效期检查
这两项是链检查中常被忽略但关键的组成部分,它们依赖 SSLProxyVerify require 生效:
-
SSLProxyCheckPeerName on:启用 SAN 字段匹配(必须关掉已废弃的
SSLProxyCheckPeerCN off) - SSLProxyCheckPeerExpire on:显式开启有效期校验;若后端时间偏差超 ±5 分钟,Apache 会静默拒绝连接(例如后端证书显示“已生效”,但 Apache 认为“尚未生效”)
- 三者(
require+CheckPeerName on+CheckPeerExpire on)缺一不可,否则无法触发完整链级校验逻辑
验证配置是否真正生效
别只看语法通过,要确认运行时行为:
- 重启后执行
apachectl configtest确保无语法错误 - 访问代理路径,观察错误日志(
ErrorLog):成功校验会记录 “SSL Proxy: peer certificate verified”,失败则明确提示原因(如 “certificate has expired”、“unable to get local issuer certificate”) - 临时把后端证书故意改过期,看是否返回 502 并在日志中出现 expire 相关报错——这是最直接的验证方式










