HAProxy 配置 HTTPS 证书加载 pem 文件的具体步骤是什么

文章导读
HAProxy 加载 HTTPS 证书的核心是将私钥和证书合并为 PEM 文件,然后在配置文件的 frontend 或 listen 段中通过 ssl crt 参数指定路径。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

HAProxy 加载 HTTPS 证书的核心是将私钥和证书合并为 PEM 文件,然后在配置文件的 frontend 或 listen 段中通过 ssl crt 参数指定路径。

先说结论:HAProxy 要求 SSL 证书必须是 PEM 格式,且私钥和证书要合并到同一个文件中,私钥内容必须放在证书内容之前。

  • 适合:需要在 HAProxy 层终止 SSL 连接、实现 HTTP 到 HTTPS 重定向、或做负载均衡的场景
  • 先准备:确认 HAProxy 编译时启用了 OpenSSL 支持,准备好证书文件并合并为 PEM 格式
  • 验收:配置完成后用 haproxy -c 检查语法,重启服务后用 curl 或浏览器验证 HTTPS 访问

命令速用版

如果你已经有证书文件(.crt 和.key),直接合并并配置即可:

mkdir -p /etc/haproxy/certs
cat your-domain.key your-domain.crt > /etc/haproxy/certs/your-domain.pem
chmod 600 /etc/haproxy/certs/your-domain.pem

如果是自签证书用于测试:

openssl req -newkey rsa:2048 -nodes -sha256 \
  -keyout /etc/haproxy/certs/example.com.key \
  -x509 -days 365 \
  -out /etc/haproxy/certs/example.com.crt
cat /etc/haproxy/certs/example.com.key /etc/haproxy/certs/example.com.crt > /etc/haproxy/certs/example.com.pem

配置文件关键行:

frontend webcluster-https
    bind *:443 ssl crt /etc/haproxy/certs/your-domain.pem
    mode http
    default_backend web_servers

为什么会这样

HAProxy 处理 SSL 证书的方式和 Nginx 不同。Nginx 可以分别指定证书文件和私钥文件,但 HAProxy 要求两者合并到同一个 PEM 文件中。这是因为 HAProxy 在启动时一次性读取证书文件,私钥和证书的顺序也有要求——私钥必须在前,证书在后。

HAProxy 配置 HTTPS 证书加载 pem 文件的具体步骤是什么

另外,HAProxy 必须在编译时启用 OpenSSL 支持才能处理 SSL。大多数现代发行版的预编译包都已启用,但如果是源码编译,需要添加 USE_OPENSSL=1 参数。

SSL 终端(在 HAProxy 层解密)和 SSL 穿透(直接透传到后端)是两种不同策略。上面说的是 SSL 终端方案,适合需要在 HAProxy 层做 HTTP 头修改、日志记录或 HTTP 到 HTTPS 重定向的场景。

分步处理

第一步:确认 HAProxy 支持 SSL

haproxy -vv | grep -i openssl

如果输出中包含 OpenSSL 相关信息,说明支持 SSL。如果没有任何输出,可能需要重新编译 HAProxy。

第二步:准备证书文件

从证书提供商下载证书文件,通常包括:

  • 服务器证书(.crt 或.pem)
  • 私钥文件(.key)
  • 中间证书(如果有,需要合并到 PEM 文件中)

合并顺序:私钥 → 服务器证书 → 中间证书

HAProxy 配置 HTTPS 证书加载 pem 文件的具体步骤是什么
cat your-domain.key your-domain.crt intermediate.crt > /etc/haproxy/certs/your-domain.pem

第三步:设置文件权限

chmod 600 /etc/haproxy/certs/your-domain.pem
chown root:root /etc/haproxy/certs/your-domain.pem

私钥文件权限要严格控制。上述命令设置为仅 root 可读。如果 HAProxy 进程以非 root 用户运行,请确保该用户有权读取文件(例如调整所属组或权限),但生产环境建议避免权限过松。

第四步:编辑配置文件

在/etc/haproxy/haproxy.cfg 中分离 frontend 和 backend 配置:

frontend webcluster-http
    bind *:80
    redirect scheme https if !{ ssl_fc }

frontend webcluster-https
    bind *:443 ssl crt /etc/haproxy/certs/your-domain.pem
    mode http
    default_backend web_servers

backend web_servers
    balance roundrobin
    server backend1 192.168.0.10:80 check
    server backend2 192.168.0.20:80 check

注意:balance 参数和 server 定义应位于 backend 段,frontend 仅负责绑定端口和路由转发。

第五步:检查配置并重启

haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl restart haproxy

配置检查通过后再重启,避免配置错误导致服务无法启动。

HAProxy 配置 HTTPS 证书加载 pem 文件的具体步骤是什么

怎么验证是否生效

用 curl 测试 HTTPS 连接:

curl -vk https://your-domain.com

如果看到 SSL 握手信息和 HTTP 响应,说明证书加载成功。自签证书会显示证书不受信任的警告,这是正常的。

检查 HAProxy 进程和端口:

ss -tlnp | grep haproxy
systemctl status haproxy

查看日志确认没有 SSL 相关错误:

journalctl -u haproxy -f
tail -f /var/log/haproxy.log

浏览器访问 https://your-domain.com,查看地址栏是否有锁形图标,点击可查看证书详情。

常见坑

  • PEM 文件顺序错误:私钥必须放在证书内容之前,否则 HAProxy 启动会报错
  • 文件权限过松:私钥文件权限不要超过 600,否则 HAProxy 可能拒绝加载
  • HAProxy 未编译 SSL 支持:源码编译时忘记加 USE_OPENSSL=1,导致 bind *:443 ssl 语法不识别
  • 中间证书缺失:某些 CA 签发的证书需要中间证书,否则部分客户端会报证书链不完整
  • SELinux 限制:开启 SELinux 时,确保证书文件上下文允许 HAProxy 读取
  • 防火墙未放行 443:配置完成后记得检查防火墙规则,确保 443 端口可达
  • 配置结构错误:balance 和 server 参数必须放在 backend 段,放在 frontend 中无效

参考来源