servername必须与ssl证书绑定的域名完全匹配,否则触发证书不匹配警告;推荐证书同时包含主域名和www变体,或使用san字段添加多域名,通配符证书需额外包含根域。

ServerName 是 Apache 虚拟主机识别请求域名的核心指令,它必须与 SSL 证书中绑定的域名完全匹配,否则浏览器会触发“证书不匹配”警告——这不是配置失败,而是安全机制在起作用。
证书域名必须覆盖 ServerName 值
SSL 证书(尤其是 DV 类)只对 明确列出的域名 有效。如果你的 ServerName 设为 www.example.com,而证书只签发给了 example.com,访问时就会报错。
- 推荐做法:证书至少包含主域名和带 www 的变体,即
example.com和www.example.com - 更稳妥的方式是使用
subjectAltName (SAN)字段一次性添加多个域名,比如还加上admin.example.com或api.example.com - 通配符证书(
*.example.com)可覆盖所有二级子域,但不包括根域本身,所以仍需单独加example.com
HTTP 和 HTTPS 虚拟主机的 ServerName 必须一致
Apache 要求 :80 和 :443 两个虚拟主机的 ServerName 完全相同,否则重定向或证书加载可能异常。
- 错误示例:
:80中写example.com,:443中写www.example.com→ 浏览器跳转后证书仍不匹配 - 正确写法:两者都设为
www.example.com,或统一用example.com(推荐后者,再用重定向补全 www) - 若需同时支持两个域名,可在
ServerAlias中补充,如ServerAlias example.com
启用 SNI 支持多域名共用 IP 的 HTTPS
一台服务器、一个公网 IP,想托管多个 HTTPS 站点?关键就是开启 SNI(Server Name Indication),它让客户端在 TLS 握手初期就告诉服务器要访问哪个域名,Apache 才能据此选择对应证书。
- 前提:Apache 2.2.12+、OpenSSL 0.9.8j+、客户端浏览器支持 SNI(Chrome 6+、Firefox 2+、Safari 3+ 均支持)
- 无需额外配置开关,只要每个
<virtualhost></virtualhost>都有独立的ServerName+ 对应的SSLCertificateFile和SSLCertificateKeyFile,Apache 自动按 SNI 分发 - 注意:老旧系统(如 Windows XP + IE6/8)不支持 SNI,会拿到第一个定义的证书,导致其他站点报错
常见陷阱与验证方法
即使配置看似正确,仍可能因细节出错导致 HTTPS 失效。
- 检查证书是否过期:
openssl x509 -in /path/to/cert.crt -text -noout | grep "Not After" - 确认私钥与证书匹配:
openssl x509 -noout -modulus -in cert.crt | openssl md5和openssl rsa -noout -modulus -in key.key | openssl md5输出应一致 - 验证 ServerName 是否被 DNS 正确解析,且本地 hosts 不干扰测试
- 重启 Apache 后用
curl -I https://yoursite.com查看响应头是否含200 OK和Strict-Transport-Security











