sslproxycheckpeerexpire on 必须配合 sslproxyverify require、sslproxyengine on 和 sslproxycacertificatefile 才生效,用于在反向代理中拒绝已过期后端证书连接,否则仅返回笼统的 ssl handshake failed 错误。

SSLProxyCheckPeerExpire on 是 Apache mod_ssl 中用于在反向代理场景下主动拒绝与证书已过期的后端 HTTPS 服务建立连接的安全指令。它不单独起作用,必须配合 SSLProxyVerify require 才能真正生效——因为证书过期属于证书链有效性检查的一部分,而 require 才会触发完整校验流程。
启用后,只要后端服务器返回的 TLS 证书中 Not After 时间早于 Apache 当前系统时间(允许约 5 分钟误差),连接就会被中断,返回 502 Bad Gateway,错误日志中通常出现:
SSL Proxy: Peer certificate has expired
或更底层的:
SSL handshake failed
(此时需结合 SSLProxyVerify require 和日志级别排查,不能只看表面报错)
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
必须同时配置的配套指令
仅写 SSLProxyCheckPeerExpire on 不够,以下三项缺一不可:
SSLProxyEngine on
启用 Apache 作为 HTTPS 客户端连接后端的能力;未开启则连协议层都走不通。SSLProxyVerify require
强制执行证书链验证(包括签名、CA 信任、吊销状态、有效期等);none或optional会跳过有效期检查。SSLProxyCACertificateFile /path/to/ca-bundle.crt(或SSLProxyCACertificatePath)
指定可信 CA 根证书位置;若后端用自签名或私有 CA 签发证书,此路径必须包含对应根证书,否则验证在“找 CA”阶段就失败,根本走不到过期检查。
✅ 正确示例:
SSLProxyEngine on SSLProxyVerify require SSLProxyCheckPeerExpire on SSLProxyCACertificateFile /etc/ssl/certs/internal-ca.pem
❌ 错误组合(不起作用):
SSLProxyEngine on SSLProxyVerify none # 过期检查被跳过 SSLProxyCheckPeerExpire on # 实际无效
常见失效原因与修复
Apache 系统时间严重偏差
后端证书是否“过期”,是拿 Apache 自身系统时间比对的。若服务器时间快或慢超过 5 分钟(OpenSSL 默认容差),即使证书未过期也会被拒。
✅ 修复:同步 NTP,运行timedatectl status或ntpq -p确认时间准确。CA 证书路径错误或权限不足
SSLProxyCACertificateFile指向的文件不存在、格式非 PEM、或 Apache 进程用户(如www-data)无读取权限,会导致整个SSLProxyVerify require失败,错误日志里往往只显示笼统的SSL handshake failed。
✅ 修复:检查ls -l /path/to/ca.pem,确认属主和权限(建议644),必要时用sudo -u www-data cat /path/to/ca.pem测试可读性。后端证书本身已过期,但你没意识到
尤其是内部测试环境常用自签名证书,默认有效期常为 30 天。openssl x509 -in backend.crt -noout -dates可直接查看有效期。用了
SSLProxyCheckPeerCN on(旧版废弃指令)
在 Apache ≥ 2.4.26 中该指令已被移除,若配置中残留,Apache 启动会失败,后续所有SSLProxy*指令都不加载。
✅ 修复:彻底删除SSLProxyCheckPeerCN行,改用SSLProxyCheckPeerName on(校验 SAN)配合require。
调试建议:快速确认是否真在检查过期
- 临时将后端服务证书替换成一个人为签发的、明确过期的测试证书(例如
Not After = 20200101000000Z); - 确保
SSLProxyVerify require和SSLProxyCheckPeerExpire on已启用; - 发起请求,观察是否立即返回
502,并检查 error_log 是否出现Peer certificate has expired; - 若仍通,则说明验证链某处被绕过(大概率是
SSLProxyVerify未设为require或 CA 文件未生效)。
不复杂但容易忽略










