版本概述

Apache 2.2.x
已弃用
Apache 2.2 系列是较旧的版本,虽然仍在使用,但已不再维护。建议升级到 Apache 2.4 或更高版本。
⚠️ 注意: Apache 2.2 已于 2017 年停止维护,存在安全风险,强烈建议升级。
Apache 2.4.x
当前主流
Apache 2.4 是目前最广泛使用的版本,提供了更好的性能、安全性和配置灵活性。支持 HTTP/2、更现代的 SSL/TLS 配置。
✅ 推荐: 这是目前最稳定和推荐的版本,支持所有现代 SSL/TLS 特性。
Apache 2.5.x
未来版本
Apache 2.5 是正在开发中的版本,将包含更多新特性和性能改进。目前仍在开发阶段,不建议在生产环境使用。

SSL 模块加载

所有 Apache 版本都需要加载 SSL 模块才能使用 HTTPS。不同版本的模块加载方式略有不同:

Apache 2.2.x

LoadModule ssl_module modules/mod_ssl.so

Apache 2.4.x / 2.5.x

LoadModule ssl_module modules/mod_ssl.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
💡 提示: Apache 2.4+ 需要额外加载 mod_socache_shmcb 模块以支持 SSL 会话缓存,这可以显著提升性能。

证书配置差异

这是不同 Apache 版本之间最重要的配置差异:

Apache 2.2.x 配置方式

<VirtualHost *:443> ServerName yourdomain.com DocumentRoot "/var/www/html" SSLEngine on SSLCertificateFile /path/to/your_domain.crt SSLCertificateKeyFile /path/to/your_domain.key SSLCertificateChainFile /path/to/intermediate_ca.crt </VirtualHost>

Apache 2.4.x 配置方式(推荐)

<VirtualHost *:443> ServerName yourdomain.com DocumentRoot "/var/www/html" SSLEngine on SSLCertificateFile /path/to/fullchain.crt SSLCertificateKeyFile /path/to/your_domain.key # # 已弃用,但仍可用</VirtualHost>
⚠️ 重要变化:
  • Apache 2.4.8 开始,SSLCertificateChainFile 指令已被弃用 - 从 Apache 2.4.8 开始,SSLCertificateChainFile 指令已被弃用
  • 现在应该将证书和中间证书链合并到一个文件中(fullchain.crt)
  • 合并命令:cat your_domain.crt intermediate_ca.crt > fullchain.crt
  • 如果继续使用 SSLCertificateChainFile,Apache 会显示警告信息

Apache 2.4.8+ 兼容配置(向后兼容)

<VirtualHost *:443> ServerName yourdomain.com DocumentRoot "/var/www/html" SSLEngine on SSLCertificateFile /path/to/your_domain.crt SSLCertificateKeyFile /path/to/your_domain.key SSLCertificateChainFile /path/to/intermediate_ca.crt # # 已弃用,但仍可用</VirtualHost>
📝 说明: 虽然 SSLCertificateChainFile 在 2.4.8+ 中仍可使用,但建议迁移到新的配置方式,因为未来版本可能会完全移除该指令。

协议和加密套件

配置项 Apache 2.2.x Apache 2.4.x Apache 2.5.x
SSLProtocol SSLProtocol all -SSLv2 -SSLv3 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
推荐协议 TLSv1.2 TLSv1.2 TLSv1.3 TLSv1.2 TLSv1.3
SSLCipherSuite SSLCipherSuite HIGH:!aNULL:!MD5 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
HTTP/2 支持 ❌ 不支持 ✅ 支持(需 mod_http2) ✅ 支持
OCSP Stapling ❌ 不支持 ✅ 支持 ✅ 支持

Apache 2.2.x 完整配置示例

<VirtualHost *:443> ServerName yourdomain.com DocumentRoot "/var/www/html" SSLEngine on SSLCertificateFile /path/to/your_domain.crt SSLCertificateKeyFile /path/to/your_domain.key SSLCertificateChainFile /path/to/intermediate_ca.crt SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite HIGH:!aNULL:!MD5 SSLHonorCipherOrder on </VirtualHost>

Apache 2.4.x 完整配置示例(推荐)

<VirtualHost *:443> ServerName yourdomain.com DocumentRoot "/var/www/html" SSLEngine on SSLCertificateFile /path/to/fullchain.crt SSLCertificateKeyFile /path/to/your_domain.key # # 现代 TLS 协议配置 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder on # # HTTP/2 支持(需要 mod_http2) Protocols h2 http/1.1 # # OCSP Stapling(提升性能) SSLUseStapling on SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off # # SSL 会话缓存 SSLSessionCache "shmcb:logs/ssl_scache(512000)" SSLSessionCacheTimeout 300 </VirtualHost>

虚拟主机配置

HTTP 到 HTTPS 重定向

Apache 2.2.x

<VirtualHost *:80> ServerName yourdomain.com Redirect permanent / https://yourdomain.com/ </VirtualHost>

Apache 2.4.x(推荐方式)

<VirtualHost *:80> ServerName yourdomain.com Redirect permanent / https://yourdomain.com/ </VirtualHost> # # 或者使用 mod_rewrite(更灵活)<VirtualHost *:80> ServerName yourdomain.com RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </VirtualHost>
💡 提示: Apache 2.4 支持更灵活的 URL 重写规则,可以处理更复杂的重定向场景。

最佳实践

1. 证书文件组织

  • 将证书文件存放在安全目录,如 /etc/httpd/ssl/ 或 /etc/apache2/ssl/
  • 设置正确的文件权限:证书文件 644,私钥文件 600
  • 使用完整证书链(fullchain.crt)而不是单独的文件

2. 安全配置

# 禁用不安全的协议SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 # 使用强加密套件SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 # 启用 HSTS(HTTP Strict Transport Security)Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # 启用安全头Header always set X-Frame-Options "SAMEORIGIN" Header always set X-Content-Type-Options "nosniff" Header always set X-XSS-Protection "1; mode=block"

3. 性能优化

  • 启用 SSL 会话缓存以减少握手开销
  • 启用 OCSP Stapling 以提升证书验证速度
  • 使用 HTTP/2 协议提升传输效率
  • 配置适当的 SSL 会话超时时间

常见问题

1. 检查 Apache 版本

# Linux httpd -v # # 或apache2 -v # # 查看已加载的模块httpd -M | grep ssl

2. 测试配置语法

# # 测试配置文件语法httpd -t # # 或apache2ctl configtest # # 如果配置正确,会显示 "Syntax OK"

3. 常见错误及解决方案

错误: SSLCertificateChainFile: file '/path/to/chain.crt' does not exist or is empty
解决: 检查证书链文件路径是否正确,或使用 fullchain.crt 方式配置
错误: SSL library error: error:140A90A1:SSL routines:SSL_CTX_new:unable to find ssl method
解决: 确保已正确加载 mod_ssl 模块,检查 OpenSSL 版本是否兼容
错误: AH00558: httpd: Could not reliably determine the server's fully qualified domain name
解决: 在配置文件中添加 ServerName 指令

4. 验证 SSL 配置

# 使用在线工具验证https://www.ssllabs.com/ssltest/ https://myssl.com/ # 使用命令行工具openssl s_client -connect yourdomain.com:443 -servername yourdomain.com

版本迁移指南

从 Apache 2.2 升级到 2.4

  1. 备份现有配置cp -r /etc/httpd /etc/httpd.backup
  2. 升级 Apache:使用包管理器升级到 2.4 版本
  3. 合并证书链cat your_domain.crt intermediate_ca.crt > fullchain.crt
  4. 更新配置:移除 SSLCertificateChainFile,使用合并后的 fullchain.crt
  5. 测试配置httpd -t 检查语法
  6. 重启服务systemctl restart httpd
  7. 验证功能:访问网站确认 HTTPS 正常工作
📝 注意事项:
  • Apache 2.4 的配置文件语法与 2.2 基本兼容,但建议使用新的配置方式
  • 某些第三方模块可能需要重新编译或更新
  • 建议在测试环境先验证配置后再应用到生产环境