apache作为api网关透传客户端证书需配置双向tls:入向启用sslverifyclient require并指定ca证书,出向启用sslproxyengine及代理机器证书,再通过requestheader set x-client-cert "%{ssl_client_cert}e"将pem证书注入http头。

启用入向客户端证书验证
Apache 必须先接收并校验客户端发来的证书,才能决定是否信任并继续透传:
- 在
<virtualhost></virtualhost>块中开启 SSL 并强制要求客户端证书:SSLEngine onSSLVerifyClient requireSSLVerifyDepth 2(匹配证书链深度,如根 CA + 中间 CA) - 指定受信任的根 CA 证书文件:
SSLCACertificateFile /etc/ssl/certs/ca-bundle-client.crt
(该文件必须包含客户端证书所签发的根 CA 和全部中间证书,PEM 格式,顺序为:根 → 中间) - 可选但推荐:记录客户端证书信息供调试或日志审计:
SSLOptions +StdEnvVars +ExportCertData
此时环境变量SSL_CLIENT_CERT将包含 PEM 编码的原始证书内容
启用出向 SSLProxyEngine 并加载客户端机器证书
仅验证客户端还不够——要让 Apache 以 HTTPS 客户端身份连接后端,并把原始客户端证书“当作自己的证书”发送出去,需配置代理侧 TLS:
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 必须在同个
<virtualhost></virtualhost>或对应<location></location>块内启用:SSLProxyEngine on - 告诉 Apache 使用哪张证书代表自己去连后端(即透传用的“代理机器证书”):
SSLProxyMachineCertificateFile /etc/ssl/private/client-proxy.pem
注意:该 PEM 文件必须同时包含证书和私钥(或用SSLProxyMachineCertificateKeyFile单独指定密钥);它应与客户端提交的证书具有相同身份(如相同 CN/OU),否则后端可能拒绝 - 若后端也使用私有 CA 签发证书,还需信任其根:
SSLProxyCACertificateFile /etc/ssl/certs/backend-ca.crt
透传证书内容到后端服务(非证书文件,而是原始 PEM)
很多后端服务(如 Spring Boot、Node.js Express、自研网关)不直接接收 TLS 层证书,而是依赖 HTTP 头解析原始证书内容。此时需手动提取并注入:
- 利用 Apache 的环境变量和
RequestHeader指令:RequestHeader set X-Client-Cert "%{SSL_CLIENT_CERT}e" env=SSL_CLIENT_CERT - 确保头字段被允许传递(部分后端会过滤未知头):
若后端是 Nginx 或其他 Apache,需确认未启用underscores_in_headers off或类似限制 - 敏感性提醒:该头含完整 PEM 证书,务必只在可信内网链路中启用,禁止暴露至公网;建议配合
SSLRequire或 IP 白名单做前置访问控制
完整代理路径与上下文保全
避免因代理导致业务逻辑错乱:
- 保留原始 Host 和协议标识:
ProxyPreserveHost onRequestHeader set X-Forwarded-Proto "https" env=HTTPS - 若后端需识别真实客户端 IP:
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}e
(注意:仅在 Apache 直连客户端或前端为可信 LB 时启用,防伪造) - 代理目标示例(假设后端是
https://api.internal:8443):ProxyPass /api/ https://api.internal:8443/ProxyPassReverse /api/ https://api.internal:8443/
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










