在 Apache 服务器上配置 SSL 证书实现 HTTPS,核心是启用 mod_ssl 模块、准备证书文件、配置 443 端口虚拟主机,适合需要为网站添加加密通信的生产环境。
先说结论:Apache 配置 HTTPS 需要安装 SSL 模块、获取证书文件、修改配置文件并重启服务。注意 Apache 2.4.8+ 版本不再支持 SSLCertificateChainFile 指令,需将证书链合并到主证书文件中。
- 适合:已有 Apache 服务器、需要为域名启用 HTTPS 加密的场景
- 先准备:证书文件(.crt)、私钥文件(.key)、证书链文件(.crt)、备份工具
- 验收:通过浏览器访问 https://域名 确认无证书警告且连接正常,HTTP 自动跳转 HTTPS
前置检查与备份
操作前请确认 Apache 版本并备份配置文件,避免配置错误导致服务无法启动。
1. 检查 Apache 版本
httpd -v # 或 apache2 -v
如果版本低于 2.4.8,可使用 SSLCertificateChainFile 指令;2.4.8+ 建议合并证书链。
2. 检查 SSL 模块
apachectl -m | grep ssl # 或 httpd -m | grep ssl
输出包含 ssl_module 说明模块已加载。若无输出,Ubuntu 执行 sudo a2enmod ssl,CentOS 执行 sudo yum install mod_ssl。
3. 备份配置文件
修改前务必备份,以便出错时快速回滚:
# Ubuntu/Debian sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak # CentOS/RHEL sudo cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak
证书文件处理
从证书颁发机构获取文件后,通常包含域名证书、私钥和证书链。对于 Apache 2.4.8+,需将证书链合并到域名证书中。
1. 创建存储目录
sudo mkdir -p /etc/apache2/ssl/ # CentOS 路径通常为 /etc/httpd/ssl/ 或 /etc/pki/tls/certs/
2. 合并证书链(Apache 2.4.8+ 推荐)
将证书链内容追加到域名证书文件末尾,生成完整证书文件:
cat domain.crt chain.crt > fullchain.crt sudo cp fullchain.crt domain.key /etc/apache2/ssl/
3. 设置文件权限
私钥文件权限必须严格限制,防止泄露:
sudo chmod 700 /etc/apache2/ssl/ sudo chmod 600 /etc/apache2/ssl/domain.key sudo chmod 644 /etc/apache2/ssl/fullchain.crt
配置 HTTPS 虚拟主机
编辑 SSL 配置文件,路径因系统而异:
- Ubuntu/Debian:/etc/apache2/sites-available/default-ssl.conf
- CentOS/RHEL:/etc/httpd/conf.d/ssl.conf
关键配置项如下(注意已移除废弃的 SSLCertificateChainFile):
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/fullchain.crt
SSLCertificateKeyFile /etc/apache2/ssl/domain.key
# SSLCertificateChainFile 指令在 2.4.8+ 已废弃,无需配置
</VirtualHost>配置 HTTP 强制跳转 HTTPS
为了安全,建议将 80 端口请求强制跳转到 443。在配置文件中添加或修改 80 端口虚拟主机:
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost>或者使用 Rewrite 规则:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]启用站点与重启
Ubuntu 系统需启用站点配置:
sudo a2ensite default-ssl sudo a2enmod ssl
重启前测试配置语法:
sudo apachectl configtest # 输出 Syntax OK 说明配置无误
重启服务:
sudo systemctl restart apache2 # 或 sudo systemctl restart httpd
验证方法
配置完成后,通过以下方式验证:
- 浏览器访问 https://你的域名,查看地址栏是否有锁形图标
- 使用 curl 命令测试:curl -vI https://你的域名
- 检查 443 端口是否监听:netstat -tlnp | grep 443
- 查看 Apache 错误日志:/var/log/apache2/error.log 或 /var/log/httpd/error_log
- 验证 HTTP 跳转:curl -I http://你的域名 应返回 301 状态码
常见坑
- 证书路径错误:配置文件中的证书路径必须绝对路径,且 Apache 进程有读取权限
- 私钥权限过宽:私钥文件权限应设为 600,避免安全风险
- 防火墙未放行 443:服务器防火墙或云服务商安全组需要开放 443 端口
- 证书链缺失:商业证书缺少证书链会导致部分浏览器不信任,需合并到主证书文件
- 配置未备份:直接修改配置文件可能导致服务无法启动,务必先备份
- 旧客户端兼容性:WinXP、Java6、Android 2.3 等不支持 SNI,多域名证书场景需注意
参考来源
- Apache HTTP Server 官方文档 - SSL/TLS Encryption
- Let's Encrypt 官方指南 - Apache 安装 HTTPS
- 阿里云开发者社区 - Linux 配置 Apache2 支持 HTTPS 方案
- 腾讯云文档 - Apache 服务器证书安装 (Linux)