为特定域名配置专属ssl证书,核心是每个块必须独立声明sslengine on、servername、sslcertificatefile和sslcertificatekeyfile,证书路径须隔离存放且与域名严格匹配,私钥权限设为600,启用ssl_module并执行configtest后重载服务。

为特定域名配置专属 SSL 证书,核心是让每个 <virtualhost></virtualhost> 块完全独立地声明自己的证书路径、私钥和域名标识,而不是共用全局设置。Apache 不会自动“猜”哪个证书对应哪个域名——它靠 SNI 机制在 TLS 握手时读取客户端发送的域名,再精准匹配到对应的虚拟主机块,进而加载该块里指定的证书。
确保每个 VirtualHost 都监听 443 并启用 SSL 引擎
每个要走 HTTPS 的域名,都必须有自己独立的 <virtualhost></virtualhost> 块,且必须包含:
- SSLEngine on —— 必须显式开启,否则证书不会被加载
- ServerName domain.com —— 必须与证书中 Subject 或 SAN(Subject Alternative Name)字段完全一致(区分 www 和非 www)
- ServerAlias www.domain.com(可选)—— 若证书也覆盖 www 版本,才加此项
- DocumentRoot 指向该站点的实际文件目录
为每个域名准备并指向专属证书文件
不能把多个域名的证书混在一个路径下,也不能让两个 <virtualhost></virtualhost> 共用同一组 SSLCertificateFile 路径。正确做法是:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 把每个域名的证书(如
fullchain.pem)、私钥(privkey.pem)单独存放在各自目录,例如:/etc/letsencrypt/live/site-a.com/fullchain.pem/etc/letsencrypt/live/site-b.com/privkey.pem - 在 site-a.com 的虚拟主机中写:
SSLCertificateFile /etc/letsencrypt/live/site-a.com/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/site-a.com/privkey.pem - Apache 2.4.8+ 可省略
SSLCertificateChainFile(因 fullchain 已含中间证书);若用老版本或商业证书,需补上该指令并指向正确的链文件
严格校验证书与域名的匹配关系
证书不匹配会导致浏览器报错 NET::ERR_CERT_COMMON_NAME_INVALID,这不是配置语法问题,而是证书本身不支持该域名:
- 用命令检查证书实际覆盖的域名:
openssl x509 -in /path/to/cert.pem -text -noout | grep -A1 "Subject Alternative Name" - 单域名证书只认一个精确域名(如
shop.example.com),不自动包含www.shop.example.com - 通配符证书(
*.api.example.com)只覆盖二级子域,不包括根域名api.example.com - SAN 证书必须在输出中明确列出你配置的
ServerName
注意权限与模块状态
即使路径和内容都对,权限错误或模块未启用也会导致证书加载失败:
- 私钥文件权限必须为
600:chmod 600 /etc/ssl/private/site-a.com.key - 确认
ssl_module已启用:
Ubuntu/Debian 执行a2enmod ssl;CentOS/RHEL 检查LoadModule ssl_module modules/mod_ssl.so是否未被注释 - 运行
apachectl configtest确保语法无误,再systemctl reload apache2(或 httpd)生效










