sslproxycheckpeerexpire on必须与sslproxyverify require配合使用,单独启用无效;它仅在校验链完整时检查后端证书有效期,时间偏差超5分钟或san不匹配会导致误报过期。
要在 apache 虚拟主机中用 sslproxycheckpeerexpire on 防止后端 https 服务因证书过期导致代理中断,关键不是单独开启它,而是把它作为一套证书校验机制中的必要一环——它只在 sslproxyverify require 已启用的前提下才真正生效,且会严格检查后端证书是否仍在有效期内。
SSLProxyCheckPeerExpire 的作用和前提条件
该指令控制 Apache 在反向代理连接后端 HTTPS 服务时,是否验证对方证书的 有效期。它默认为 off,必须显式设为 on 才启用。但它不会独立工作:
- 必须搭配 SSLProxyVerify require 使用,否则整个证书校验流程被跳过,expire 检查也就无从谈起
- 仅当后端证书的
Not Before和Not After时间范围不包含当前系统时间,且该检查被激活时,Apache 才会拒绝连接并返回 502 错误 - 它不检查吊销状态(那是 OCSP 或 CRL 的事),只管“有没有过期”这一项
在 VirtualHost 中正确启用 expire 校验
把以下几行一起写进你的 <virtualhost></virtualhost> 块内(顺序无关,但建议集中放置):
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- SSLProxyEngine on —— 启用代理模式下的 HTTPS 客户端能力
- SSLProxyVerify require —— 强制校验证书链、签名、域名匹配和有效期
- SSLProxyCheckPeerExpire on —— 显式打开有效期检查(虽是 SSLProxyVerify require 的一部分,但单独声明更清晰、可维护)
- SSLProxyCheckPeerName on —— 确保证书 SAN 匹配 ProxyPass 目标域名,避免因主机名不匹配误判为“过期”
- SSLProxyCACertificateFile /path/to/ca-bundle.crt —— 提供可信 CA 列表,否则连握手都失败,更谈不上检查有效期
为什么开了 expire 还报错?常见原因
启用后出现 502 或日志里提示 SSL Proxy: Peer certificate has expired,通常不是配置错误,而是后端证书确实已过期或系统时间不准:
-
后端服务器时间偏差超过 5 分钟:Apache 默认允许 ±5 分钟误差。若后端时间快了 6 分钟,其证书可能显示“已生效”,但 Apache 认为“尚未生效”;反之亦然。用
ntpdate -q [time-server]校准时间 - CA 证书或中间证书本身过期:SSLProxyCACertificateFile 指向的文件里若混入了已过期的中间 CA 证书,会导致整条链校验失败,错误日志可能模糊地表现为 handshake failed,而非明确提示 expire
-
ProxyPass 目标域名与证书 SAN 不符:比如 ProxyPass 指向
https://api.internal,但证书只含DNS:backend.internal,Apache 可能无法完成完整校验,进而提前中断,看起来像过期问题
调试和验证方法
别依赖猜测。用 OpenSSL 直接模拟 Apache 的校验逻辑:
- 运行:
openssl s_client -connect api.internal:443 -CAfile /path/to/ca-bundle.crt -servername api.internal - 观察输出中的
verify return code:0 表示通过;10 表示证书过期;18 表示自签名证书未被信任 - 同时检查
notAfter时间是否早于当前时间,以及subjectAltName是否包含目标域名










