Apache中多个域名共用一张SAN证书,需为每个域名配置独立的<VirtualHost *:443>块,各块中ServerName设主域名、ServerAlias列其余域名,并全部指向同一套证书文件,且证书SAN列表必须包含所有域名。

Apache 中让多个域名共用一张多域名证书(如 SAN 证书),关键不是靠 ServerName 写多个,而是通过 ServerName + ServerAlias 明确告诉 Apache 哪些域名应由这个虚拟主机响应,并确保这些域名全部出现在证书的 Subject Alternative Name(SAN)列表中。
证书本身必须合法覆盖所有目标域名,Apache 配置只是“路由请求”,不参与证书有效性判断——它只负责把匹配到的域名交给对应 <VirtualHost>,再由该块加载指定证书。只要证书里有这些域名,就能复用同一组证书文件。
✅ 确认证书支持多域名
运行命令检查证书是否包含你要绑定的所有域名:
openssl x509 -in /etc/ssl/certs/example.com.crt -text -noout | grep -A1 "Subject Alternative Name"
输出应类似:
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:api.example.com, DNS:shop.example.net如果 shop.example.net 不在其中,这张证书就不能用于该域名——哪怕配置写对了,浏览器也会报 ERR_CERT_COMMON_NAME_INVALID。
✅ 正确配置 VirtualHost 复用同一证书
每个需要 HTTPS 的域名,*仍需独立的 `<VirtualHost :443>` 块**(不能合并),但所有块可指向同一套证书路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
SSLCertificateFile指向同一个.crt或fullchain.pem -
SSLCertificateKeyFile指向同一个.key -
SSLCertificateChainFile(如有)也指向同一链文件 - 每个块内必须启用
SSLEngine on -
ServerName设为该站点主域名(仅一个) -
ServerAlias列出其余同属该证书的域名(空格分隔)
例如:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com api.example.com
DocumentRoot /var/www/example
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
SSLCertificateChainFile /etc/ssl/certs/example.com.chain.pem
# 其他SSL设置(协议、加密套件等)可统一放<IfModule mod_ssl.c>中
</VirtualHost>
<VirtualHost *:443>
ServerName shop.example.net
ServerAlias www.shop.example.net
DocumentRoot /var/www/shop
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
SSLCertificateChainFile /etc/ssl/certs/example.com.chain.pem
</VirtualHost>⚠️ 注意:
-
shop.example.net能用这张证书的前提是它已出现在证书的 SAN 列表里; - 两个
<VirtualHost>是独立的,各自处理自己的ServerName和ServerAlias,但共享证书文件——这是合法且常见做法; - 不要尝试在单个
ServerName后写多个域名(语法错误); - 不要把证书路径写在全局配置或
<IfModule>外层——Apache 不会识别。
✅ 权限与路径必须规范
- 私钥文件权限必须是
600(仅 root 可读写):chmod 600 /etc/ssl/private/example.com.key
- 所有路径使用绝对路径,避免相对路径导致加载失败;
- 证书链文件(如
chain.pem)若缺失,部分客户端(尤其旧 Android 或 Java 应用)可能校验失败。
✅ 验证与重启
配置完成后务必执行:
apachectl configtest # 检查语法 systemctl reload apache2 # 无报错才 reload
然后用不同域名访问,用浏览器开发者工具 → 安全标签页 → 查看证书详情,确认显示的域名与请求一致,且签发对象包含当前域名。
不复杂但容易忽略细节。

















