在 HAProxy 中禁止弱加密套件,最推荐的做法是在配置文件的 global 或 defaults 段通过 ssl-default-bind-ciphers 和 ssl-default-bind-options 参数强制指定高强度算法,并禁用 TLS 1.1 及以下版本,适用于面向公网的生产环境。
先说结论:配置 HAProxy 的 SSL 绑定选项是阻断弱加密最直接的方式,但需兼顾旧客户端兼容性。
- 先判断:确认业务是否还有必须支持的老版本客户端(如 IE11 以下、旧版 Android)。
- 优先做:在 global 段设置 ssl-default-bind-options 禁用低版本 TLS,并限定加密套件列表。
- 再验证:使用 openssl 或 sslscan 工具测试端口,确认弱套件无法握手。
命令速用版
这里提供一段可直接参考的配置片段,放入 haproxy.cfg 的 global 部分即可生效:
global
# 禁用 TLS 1.0 和 1.1,强制最低 TLS 1.2
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
# 设置 TLS 1.2 及以下的强加密套件
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
# 设置 TLS 1.3 加密套件 (HAProxy 2.0+)
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256为什么会这样
弱加密套件(如 RC4、DES、3DES 或基于 MD5 的算法)存在已知的数学缺陷,攻击者可以通过算力暴力破解或利用协议漏洞(如 POODLE、BEAST)解密流量。HAProxy 作为入口网关,如果不显式禁止这些套件,默认可能会为了兼容性保留它们,导致安全风险。此外,TLS 1.0 和 1.1 协议本身已被主要浏览器和标准组织弃用,继续开放会降低安全评级。
分步处理
1. 备份配置:修改前务必备份当前配置文件,防止配置错误导致服务无法启动。
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak2. 编辑配置:打开配置文件,找到 global 段落,添加或修改上述 ssl-default-bind 相关参数。注意 HAProxy 2.0 版本后才正式支持 TLS 1.3 配置参数。
3. 检查语法:重载前必须检查配置语法是否正确。
haproxy -c -f /etc/haproxy/haproxy.cfg4. 平滑重载:语法检查通过后,执行重载命令,避免中断现有连接。
systemctl reload haproxy怎么验证是否生效
使用 openssl 命令尝试连接,指定弱协议或弱套件,观察是否握手失败。
测试 TLS 1.1 是否被禁:
openssl s_client -connect 你的域名:443 -tls1_1如果配置生效,上述命令应返回握手错误(Handshake Failure)。
测试当前协商的加密套件:
openssl s_client -connect 你的域名:443查看输出中的 Cipher 字段,确认是否为强套件(如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)。
常见坑
1. 旧客户端无法访问:强制 TLS 1.2 会导致 Windows XP 上的 IE 或部分旧版 Android 设备无法连接,需评估业务影响。
2. TLS 1.3 参数混淆:HAProxy 中 ssl-default-bind-ciphers 仅针对 TLS 1.2 及以下,TLS 1.3 需使用 ssl-default-bind-ciphersuites,写错会导致 TLS 1.3 回退或使用默认值。
3. 重载失败导致停机:如果配置语法有误且直接 restart 而非 reload,可能导致服务中断。务必先执行 haproxy -c 检查。
参考来源
- HAProxy Official Documentation - Management Guide (https://www.haproxy.com/documentation/)
- Mozilla SSL Configuration Generator (https://ssl-config.mozilla.org/)