HAProxy配置SSL加密转发核心在于选择SSL终止或SSL透传:SSL终止由HAProxy解密HTTPS、后端走HTTP,支持请求头修改;SSL透传则仅四层转发加密流量,后端自行处理TLS且无法修改HTTP头。

HAProxy 配置 SSL 加密转发,核心在于明确你想要的是 SSL 终止(Termination) 还是 SSL 透传(Pass-through)。两者实现方式、安全边界和后端要求完全不同,不能混用。
SSL 终止:HAProxy 解密 HTTPS,后端走 HTTP
这是最常用、最实用的方案。HAProxy 承担 TLS 握手和解密开销,把明文 HTTP 请求转发给后端,大幅降低后端服务器 CPU 压力,同时保留对请求头(如 X-Forwarded-For、X-Forwarded-Proto)的读写能力。
你需要:
- 确保 HAProxy 编译时启用了 OpenSSL 支持(运行
haproxy -vv | grep ssl,看到openssl或libssl即可) - 准备好完整的 PEM 格式证书文件(含公钥证书 + 私钥,顺序不限,但必须合并为一个文件)
- 在
frontend中绑定 443 端口并指定证书路径
示例配置片段:
frontend https-in
bind *:80
bind *:443 ssl crt /etc/haproxy/cert/www.example.com.pem
redirect scheme https if !{ ssl_fc }
mode http
option forwardfor
http-request set-header X-Forwarded-Proto https if { ssl_fc }
default_backend web-servers
backend web-servers
mode http
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check注意:
-
ssl crt后跟的是单个.pem文件,不是分开的.crt和.key -
redirect scheme https if !{ ssl_fc }实现 HTTP 自动跳转 HTTPS -
http-request set-header X-Forwarded-Proto https让后端知道原始是 HTTPS 请求
SSL 透传:HAProxy 不解密,直接转发加密 TCP 流
适用于需要端到端加密、后端自行处理 TLS 的场景(比如后端是多个不同域名的 HTTPS 服务,或需保留客户端证书链)。此时 HAProxy 只做四层代理,不解析 HTTP 内容,也无法添加/修改 HTTP 头。
配置要点:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 使用
mode tcp(不能用mode http) - 不指定
ssl关键字在bind行,而是用alpn h2,http/1.1(可选)或直接透传 - 后端必须监听 HTTPS(如 443),且证书由后端自己管理
示例:
frontend https-passthrough
bind *:443
mode tcp
default_backend https-backends
backend https-backends
mode tcp
balance roundrobin
server web1 192.168.1.10:443 check ssl verify none
server web2 192.168.1.11:443 check ssl verify none说明:
-
check ssl verify none是健康检查时跳过证书校验(因是透传,HAProxy 不持有证书) - 若需校验后端证书,可用
verify required ca-file /path/to/ca.pem - 此模式下无法做基于 Host 或 Path 的七层路由
混合方案:SSL 终止 + 后端再加密(HTTPS 回源)
兼顾安全性与可控性:HAProxy 解密客户端 HTTPS,再以 HTTPS(带证书验证)转发给后端。适合对敏感数据有强合规要求的场景。
需额外配置:
- 后端
server行启用ssl和证书校验 -
backend中设置http-check expect status 200(若用 HTTP 探测)或tcp-check(更推荐)
例如:
backend secure-web
mode http
balance roundrobin
option httpchk GET /health
http-check expect status 200
server web1 192.168.1.10:443 check ssl verify required ca-file /etc/haproxy/certs/backend-ca.pem证书准备小贴士
- Certbot 获取的证书通常包含
fullchain.pem(证书链)和privkey.pem(私钥),合并命令:cat /etc/letsencrypt/live/example.com/fullchain.pem \ /etc/letsencrypt/live/example.com/privkey.pem > /etc/haproxy/cert/example.com.pem - 权限要严格:
chown haproxy:haproxy /etc/haproxy/cert/*.pem && chmod 600 /etc/haproxy/cert/*.pem - 多域名可放在同一 PEM 文件中,HAProxy 自动按 SNI 匹配
不复杂但容易忽略细节。

















