Apache TLS配置需分层适配老旧客户端:通过SetEnvIf识别User-Agent或SSL协议,用<If>条件启用最小必要协议与套件(如TLSv1+AES128-SHA),配合IP限制、禁用压缩及重协商等加固,并严格验证握手结果。

在老旧操作系统(如 Windows XP、Windows Server 2003)上运行的客户端,常依赖 SSLv3 或 TLS 1.0,且不支持 SHA-2 签名、ECDHE 密钥交换或 AEAD 加密模式。Apache 的 TLS 配置不能一刀切地追求“最新最安全”,而需按实际终端能力分层适配,核心是:明确兼容边界、最小化暴露面、隔离风险范围。
识别并限定老旧客户端的访问范围
不要让整个站点降级适配旧系统。应通过请求特征识别老旧客户端,再定向启用宽松策略:
- 用 SetEnvIf 匹配 User-Agent 或 TLS 版本线索,例如:
SetEnvIf User-Agent "MSIE [567]\." ssl_legacy=1SetEnvIf SSL_PROTOCOL "SSLv3\|TLSv1" ssl_legacy=1 - 在虚拟主机内用 <If> 块条件启用降级配置(Apache 2.4+):
<If "%{env:ssl_legacy} == '1'"><br> SSLProtocol SSLv3 TLSv1<br> SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SHA1:!DSS:!PSK:!SRP<br></If> - 搭配 Require ip 或 Require expr 进一步限制仅允许内网或特定 IP 段使用该策略,避免公网暴露
为老旧环境定制最小必要协议与套件
若必须全局支持(如纯内网工业设备系统),则启用最低可行组合,但禁用已知高危项:
- 协议层面:保留 TLSv1,显式禁用 SSLv2/SSLv3(SSLv3 存在 POODLE,TLSv1 虽有 BEAST 但可缓解):
SSLProtocol all -SSLv2 -SSLv3 -TLSv1.1 -TLSv1.2 -TLSv1.3
→ 实际生效为仅 TLSv1;如需兼容 IE6+XP,可加回 SSLv3,但必须配合其他加固 - 密码套件:禁用 NULL、EXPORT、RC4、DES、3DES-CBC(BEAST 易感)、MD5、SHA1(签名弱,但 TLS 层握手可用):
SSLCipherSuite ECDHE-RSA-AES128-SHA:AES128-SHA:DES-CBC3-SHA
(注意:AES128-SHA 和 DES-CBC3-SHA 无前向保密,仅作兜底) - 必须开启 SSLHonorCipherOrder on,防止客户端强制协商弱套件
配套加固措施降低降级风险
即使启用旧协议,也要通过传输层和应用层约束缩小攻击窗口:
- 关闭压缩:
SSLCompression off(防 CRIME 攻击) - 禁用重协商:
SSLStrictSNIVHostCheck on+SSLInsecureRenegotiation off - 证书使用 SHA-1 签名仅限于服务端证书本身(非 CA 根证书),且私钥至少 2048 位 RSA;CA 证书链仍应由可信 SHA-2 根签发(部分旧系统可接受交叉签名)
- 不启用 HSTS、OCSP Stapling、Session Tickets 等现代特性(旧客户端不识别,可能引发握手失败)
验证与监控不可省略
配置后务必实测,而非仅看浏览器能否打开:
- 用 openssl s_client 模拟旧客户端:
openssl s_client -connect example.com:443 -ssl3(测试 SSLv3)openssl s_client -connect example.com:443 -tls1(测试 TLSv1)
确认返回中 Cipher is 行匹配预期,且无 error 或 handshake failure - 检查 Apache 错误日志:
关注SSL Library Error、sslv3 alert handshake failure等记录,定位具体失败环节 - 对公网服务,用 SSL Labs Test 扫描时应将该域名单独配置,避免拉低主站评级;内网服务可跳过在线扫描,改用本地
testssl.sh


















