Apache 如何配置 SSL 证书支持 HTTPS 访问详细步骤

文章导读
在 Apache 服务器上配置 SSL 证书实现 HTTPS,核心是启用 mod_ssl 模块、准备证书文件、配置 443 端口虚拟主机,适合需要为网站添加加密通信的生产环境。
📋 目录
  1. 前置检查与备份
  2. 证书文件处理
  3. 配置 HTTPS 虚拟主机
  4. 配置 HTTP 强制跳转 HTTPS
  5. 启用站点与重启
  6. 验证方法
  7. 常见坑
  8. 参考来源
A A

在 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. 设置文件权限

私钥文件权限必须严格限制,防止泄露:

Apache 如何配置 SSL 证书支持 HTTPS 访问详细步骤
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)