Apache 使用 mod_ssl 模块处理 SSL 连接,需确保其已加载。大多数 Linux 发行版通过 a2enmod ssl 命令启用。证书部署的核心是配置 SSLCertificateFile、SSLCertificateKeyFile 和 SSLCertificateChainFile(或合并至主证书文件)三个指令。现代实践中推荐将服务器证书与中间证书合并为单个 PEM 文件,以提升兼容性并减少传输开销。
Apache 支持 SNI(Server Name Indication),允许多个域名共享同一 IP 地址的 HTTPS 服务,但要求客户端支持 TLS 1.0 及以上。对于老旧系统(如 Windows XP 或 Android 2.x),应测试无 SNI 环境下的握手成功率。
ssl证书
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/private.key
SSLCertificateChainFile /path/to/chain.pem
# 安全参数
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLCompression off
</VirtualHost>
建议禁用 TLS 1.0/1.1,强制使用 TLS 1.2+,并优先选择前向保密套件。私钥文件权限应设为 600,属主为 root。
apachectl configtest 检查语法,重启服务后通过浏览器访问测试锁图标状态。若出现“您的连接不是私密连接”提示,通常原因为:
- 证书链缺失或顺序错误
- 域名不匹配(含 www 与非 www 差异)
- 服务器时间不准确导致证书未生效或已过期
- 中间 CA 不被客户端信任(尤其 Java 或嵌入式环境)
可通过 OpenSSL 命令行工具诊断:
openssl s_client -connect example.com:443 -servername example.com
输出中查看 Verify return code 是否为 0,并确认 Certificate chain 完整。
| 维度 | 参考标准 | 工程师建议 |
|---|---|---|
| TLS 版本 | TLS 1.2 / 1.3 | 禁用 TLS 1.0/1.1,生产环境默认启用 TLS 1.3 |
| 证书链 | CA/B Forum BRs | 合并服务器证书与中间证书,根证书不包含在内 |
| 私钥保护 | 文件权限 600 | 禁止 web 用户组读取,定期轮换 |
Q:为什么浏览器提示“此服务器无法证明它是 xxx”?
A:多数因证书链不完整。使用 SSL Labs 测试工具(ssllabs.com)可快速定位缺失的中间证书。
Q:能否在同一台 Apache 上部署多个 SSL 证书?
A:可以,依赖 SNI 实现。每个 VirtualHost 配置独立证书即可,但需注意客户端兼容性。
加密您的网站,赢得客户信任!