HAProxy 配置 HTTPS 反向代理时,ssl crt 证书路径需写在 frontend 或 listen 段的 bind 行中,指向一个包含证书和私钥的合并 PEM 文件。此配置适用于 HAProxy 终止 SSL 的场景,若 HAProxy 未编译 OpenSSL 支持则无法生效。
先说结论:HAProxy 的 ssl crt 参数必须指向合并后的 PEM 文件,且 HAProxy 需支持 SSL 编译。
- 适合 HAProxy 终结 SSL 场景
- 先准备 cert 和 key 合并的 pem 文件
- 验收用
haproxy -c检查配置
命令速用版
合并证书与私钥到 PEM 文件:
cat www.example.com.crt www.example.com.key > /etc/haproxy/certs/www.example.com.pem
配置文件 bind 行设置:
bind *:443 ssl crt /etc/haproxy/certs/www.example.com.pem
为什么会这样
HAProxy 设计机制要求证书和私钥在同一文件中读取。
与 Nginx 不同,HAProxy 在编译开启 OpenSSL 支持后,要求在 bind 指令中通过 ssl crt 指定单一文件路径。该文件必须同时包含公钥证书和私钥内容,通常格式为 PEM。若分开指定或格式错误,HAProxy 启动时会报错无法加载证书。
分步处理
1. 确认 HAProxy 支持 SSL
执行 haproxy -vv 或 ldd haproxy | grep ssl。若输出中包含 libssl 字样,说明已支持 SSL 功能。若不支持,需重新编译并添加 USE_OPENSSL=1 参数。
2. 合并证书文件
将 CRT 证书文件和 KEY 私钥文件合并为一个 PEM 文件。命令示例:
cat server.crt server.key > server.pem
3. 修改配置文件
编辑 /etc/haproxy/haproxy.cfg,在 frontend 或 listen 段添加 bind 配置。示例:
frontend https_frontend bind *:443 ssl crt /etc/haproxy/certs/server.pem mode http
4. 检查配置语法
执行 haproxy -c -f /etc/haproxy/haproxy.cfg。若输出 Configuration file is valid,则语法无误。
5. 重启服务
执行 systemctl restart haproxy 使配置生效。
怎么验证是否生效
使用 OpenSSL 命令测试连接:
openssl s_client -connect 你的域名:443
若输出中包含 Certificate chain 且无握手错误,说明 SSL 终止成功。也可以在浏览器访问 HTTPS 地址,查看锁形图标及证书详情。
常见坑
1. 文件权限问题
PEM 文件需对 HAProxy 运行用户可读。若权限不足,启动日志会报 unable to load certificate。
2. 编译未开启 SSL
若配置了 ssl crt 但 HAProxy 未编译 OpenSSL 支持,启动会直接失败。需确认编译参数包含 USE_OPENSSL=1。
3. TCP 模式误用
若 mode 设置为 tcp,HAProxy 仅做四层转发,后端服务器需自行配置 SSL。此时 HAProxy 配置中不应包含 ssl crt 参数,否则可能冲突。
常见问题
证书路径必须是绝对路径吗?
建议使用绝对路径。
虽然相对路径在某些情况下可行,但绝对路径能避免因工作目录变化导致的加载失败,推荐写满完整路径如 /etc/haproxy/certs/site.pem。
PEM 文件顺序有要求吗?
通常证书在前,私钥在后。
合并时建议先 cat 证书文件再 cat 私钥文件。部分版本对顺序敏感,保持标准顺序可减少兼容性风险。
HAProxy 不做 SSL 终止怎么配置?
使用 TCP 模式透传。
若后端服务器已配置 HTTPS,HAProxy 只需设置 mode tcp 且 bind *:443 不加 ssl crt,将流量原样转发至后端 443 端口。
参考来源
- HAProxy 全站 HTTPS 配置与优化指南_haproxy 开启 ssl-CSDN 博客
- HAProxy 如何配置 SSL
- haproxy 代理 https 配置方法【转】
- HAProxy SSL 代理配置指南-CSDN 博客
- haproxy ssl 证书配置 - 金笛秀才 - 博客园