Apache是广泛使用的Web服务器,正确配置SSL证书对于保障网站安全至关重要。本文将详细介绍如何在Apache服务器上配置SSL证书,包括SSL模块启用、证书安装、虚拟主机配置和安全优化,帮助您快速部署HTTPS网站。
一、准备工作
1. 获取SSL证书
在配置Apache之前,您需要:
- 已申请SSL证书(从OHTTPS、Let's Encrypt等)
- 证书文件(.crt或.pem)
- 私钥文件(.key)
- 证书链文件(chain.crt,可选但推荐)
2. 上传证书文件
将证书文件上传到服务器:
# 创建证书目录
sudo mkdir -p /etc/apache2/ssl
# 上传证书文件
sudo cp certificate.crt /etc/apache2/ssl/
sudo cp private.key /etc/apache2/ssl/
sudo cp chain.crt /etc/apache2/ssl/
# 设置文件权限
sudo chmod 600 /etc/apache2/ssl/private.key
sudo chmod 644 /etc/apache2/ssl/certificate.crt
sudo chmod 644 /etc/apache2/ssl/chain.crt
二、启用SSL模块
1. 启用SSL模块
# Ubuntu/Debian
sudo a2enmod ssl
sudo systemctl restart apache2
# CentOS/RHEL
sudo yum install mod_ssl
sudo systemctl restart httpd
2. 启用其他必要模块
# 启用重写模块(用于HTTP到HTTPS重定向)
sudo a2enmod rewrite
sudo a2enmod headers
# 重启Apache
sudo systemctl restart apache2
三、基本SSL配置
1. 编辑虚拟主机配置
编辑站点配置文件(通常在 /etc/apache2/sites-available/ 目录):
sudo nano /etc/apache2/sites-available/example.com-ssl.conf
2. 添加SSL虚拟主机配置
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
# SSL配置
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/certificate.crt
SSLCertificateKeyFile /etc/apache2/ssl/private.key
SSLCertificateChainFile /etc/apache2/ssl/chain.crt
# SSL协议配置
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
# 文档根目录
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 错误日志
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
3. 启用站点
# 启用SSL站点
sudo a2ensite example.com-ssl.conf
# 测试配置
sudo apache2ctl configtest
# 如果测试通过,重启Apache
sudo systemctl restart apache2
四、HTTP到HTTPS重定向
1. 配置HTTP虚拟主机重定向
编辑HTTP虚拟主机配置文件:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
# 重定向所有HTTP请求到HTTPS
Redirect permanent / https://example.com/
</VirtualHost>
2. 使用Rewrite规则重定向
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
五、SSL配置优化
1. 完整的安全配置
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
# SSL配置
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/certificate.crt
SSLCertificateKeyFile /etc/apache2/ssl/private.key
SSLCertificateChainFile /etc/apache2/ssl/chain.crt
# SSL协议(只允许TLS 1.2和1.3)
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
# SSL加密套件
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder on
# OCSP Stapling
SSLUseStapling on
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
# 安全头
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"
# 文档根目录
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 日志
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
2. 全局SSL配置
编辑 /etc/apache2/conf-available/ssl-params.conf:
# 现代SSL配置
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
# OCSP Stapling
SSLUseStapling on
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
# 安全头
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"
启用配置:
sudo a2enconf ssl-params
sudo systemctl restart apache2
六、多域名配置
1. 单证书多域名
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com api.example.com blog.example.com
# SSL配置...
</VirtualHost>
2. 多证书配置(SNI)
# 第一个域名
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/example.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/example.com.key
SSLCertificateChainFile /etc/apache2/ssl/example.com.chain.crt
# 其他配置...
</VirtualHost>
# 第二个域名
<VirtualHost *:443>
ServerName another.com
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/another.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/another.com.key
SSLCertificateChainFile /etc/apache2/ssl/another.com.chain.crt
# 其他配置...
</VirtualHost>
七、常见问题排查
1. 证书链不完整
问题:浏览器显示"证书不受信任"
解决方法:
# 确保配置了证书链文件
SSLCertificateChainFile /etc/apache2/ssl/chain.crt
2. SSL模块未启用
问题:Apache无法启动或SSL不工作
解决方法:
# 检查SSL模块是否启用
apache2ctl -M | grep ssl
# 如果未启用,启用模块
sudo a2enmod ssl
sudo systemctl restart apache2
3. 权限问题
问题:Apache无法读取证书文件
解决方法:
# 检查文件权限
ls -l /etc/apache2/ssl/
# 设置正确的权限
sudo chmod 644 /etc/apache2/ssl/*.crt
sudo chmod 600 /etc/apache2/ssl/*.key
sudo chown root:root /etc/apache2/ssl/*
八、测试SSL配置
1. 使用SSL Labs测试
访问 https://www.ssllabs.com/ssltest/ 输入您的域名,查看SSL配置评分。
2. 使用命令行测试
# 测试SSL连接
openssl s_client -connect example.com:443 -servername example.com
# 检查Apache配置
sudo apache2ctl configtest
九、证书自动更新
1. 使用OHTTPS自动更新
如果使用OHTTPS申请的证书:
- 在OHTTPS平台配置自动更新
- 配置自动部署到服务器
- 证书更新后自动部署
2. 使用Certbot自动更新
# 安装Certbot
sudo apt-get install certbot python3-certbot-apache
# 申请证书(自动配置Apache)
sudo certbot --apache -d example.com -d www.example.com
# 测试自动更新
sudo certbot renew --dry-run
十、最佳实践
1. 安全配置
- ✅ 使用TLS 1.2或更高版本
- ✅ 禁用不安全的加密套件
- ✅ 启用HSTS
- ✅ 启用OCSP Stapling
- ✅ 配置安全响应头
2. 性能优化
- ✅ 启用SSL会话缓存
- ✅ 使用强加密但不过度消耗资源
- ✅ 启用OCSP Stapling减少延迟
3. 证书管理
- ✅ 定期更新证书
- ✅ 监控证书到期时间
- ✅ 备份证书和私钥
- ✅ 使用自动化工具管理证书
总结
正确配置Apache的SSL证书是保障网站安全的重要步骤。通过本文的指导,您可以:
- ✅ 正确安装和配置SSL证书
- ✅ 启用SSL模块
- ✅ 优化SSL配置提升安全性
- ✅ 配置HTTP到HTTPS重定向
- ✅ 启用安全特性(HSTS、OCSP Stapling等)
- ✅ 实现证书自动更新
记住定期更新证书,监控SSL配置,确保网站始终使用最新的安全配置。如果您需要申请免费SSL证书,推荐使用OHTTPS平台,它提供了完整的证书管理和自动部署功能。
OHTTPS: 免费HTTPS证书/SSL证书申请 • 自动化更新、部署、监控
OHTTPS 支持通过多种域名验证方式(DNS验证、HTTP验证、文件验证等)申请免费的HTTPS证书/SSL证书,包括单域名证书、多域名证书、通配符证书、IP证书等,支持HTTPS证书/SSL证书的自动化更新、自动化部署、自动化监控及告警等,并支持将HTTPS证书/SSL证书自动化部署至阿里云、腾讯云、群晖NAS、百度云、七牛云、多吉云、又拍云、宝塔面板、Docker容器、SSH等,实现HTTPS证书/SSL证书的一站式申请、更新、部署、监控和管理。