apache虚拟主机启用https需禁用sslv2-v3及tls1.0-1.1,强制启用tls1.2+,配置pfs/aead密码套件,使用完整证书链,并添加hsts等安全响应头。

Apache 虚拟主机启用 HTTPS 后,仅开启 SSL 并不等于真正安全。协议版本、加密套件、证书链和响应头等细节若配置不当,仍可能被降级攻击、弱算法利用或浏览器标记为不安全。关键在于精准控制 TLS 行为,而非简单“加上证书”。
明确禁用老旧不安全协议
SSLv2、SSLv3、TLSv1.0 和 TLSv1.1 已被证实存在严重漏洞(如 POODLE、BEAST),主流浏览器已停止支持。必须在虚拟主机配置中显式关闭:
- 使用 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 指令(Apache 2.4.8+)
- 生产环境只保留 TLSv1.2 和 TLSv1.3;若 Apache 版本 ≥ 2.4.37 且 OpenSSL ≥ 1.1.1,TLSv1.3 可直接启用
- 避免写成 SSLProtocol +TLSv1.2 +TLSv1.3 —— 这种写法不兼容旧版 Apache,且易遗漏隐式启用的旧协议
选用现代强加密套件
加密套件决定了密钥交换、身份认证和对称加密的具体算法组合。优先选择前向保密(PFS)强、无已知弱点的组合:
- 推荐配置:SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
- 必须禁用 RC4、DES、3DES、MD5、SHA1 等已被淘汰算法
- 添加 SSLHonorCipherOrder on,强制按配置顺序协商,防止客户端强行降级
补全证书链并验证完整性
浏览器信任一个证书,依赖完整的信任链:站点证书 → 中间证书 → 根证书。缺失中间证书会导致部分设备(尤其移动端)显示“证书不可信”:
- 将 CA 提供的中间证书与你的域名证书合并为单个文件(如 fullchain.crt),用 SSLCertificateFile 指向它
- 不再单独使用 SSLCertificateChainFile(Apache 2.4.8+ 已弃用)
- 用命令验证:openssl s_client -connect example.com:443 -showcerts 2>/dev/null | openssl crl2pkcs7 -nocrl -out /dev/stdout | openssl pkcs7 -print_certs -noout,确认输出中包含全部三级证书
启用 HSTS 强制浏览器走 HTTPS
HSTS(HTTP Strict Transport Security)通过响应头告诉浏览器:“未来一段时间内,只允许用 HTTPS 访问这个域名”,可彻底杜绝首次请求被劫持的风险:
- 在 HTTPS 虚拟主机内添加:Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
- max-age=31536000 表示一年,足够长但不过度锁定
- includeSubDomains 覆盖所有子域;若确定所有子域都已支持 HTTPS,再加 preload 并提交至浏览器 HSTS 预加载列表
- 注意:启用后无法临时回退 HTTP,务必确保全站资源(图片、JS、CSS)均支持 HTTPS











