apache通过sni实现单ip多https域名的核心是客户端在tls握手初期声明目标域名,服务器据此加载对应证书;需确保启用mod_ssl、listen 443、openssl≥1.0.2、每个域名独占块并配置匹配的sslcertificatefile与servername,禁用默认捕获虚拟主机,避免证书错配。
apache 通过 sni(server name indication)实现单 ip 托管多个 https 域名,核心是让客户端在 tls 握手初期就声明目标域名,服务器据此加载对应证书。配置本身不复杂,但关键点必须对齐,否则会出现证书错配、浏览器警告或握手失败。
确认基础环境已就绪
确保以下条件全部满足,SNI 才能正常工作:
- Apache 已启用
mod_ssl模块:运行a2enmod ssl(Debian/Ubuntu)或检查httpd.conf中存在LoadModule ssl_module modules/mod_ssl.so - 监听 443 端口已声明:配置中需有
Listen 443(通常在ports.conf或httpd.conf) - OpenSSL 版本 ≥ 1.0.2(推荐 ≥ 1.1.1):执行
openssl version验证;老旧系统如 Windows XP + IE6 不支持 SNI,但现代环境无需顾虑 - 每个域名的 SSL 证书已就位,且私钥未加密(避免 Apache 启动时交互式输入密码)
为每个域名写独立的 VirtualHost 块
不能复用同一组证书,也不能靠 ServerAlias 堆叠多个域名——SNI 要求每个域名有明确对应的虚拟主机定义。示例配置如下:
ServerName example.com
DocumentRoot /var/www/example
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com/fullchain.pem
SSLCertificateKeyFile /etc/ssl/certs/example.com/privkey.pem
Require all granted
ServerName api.example.org
DocumentRoot /var/www/api
SSLEngine on
SSLCertificateFile /etc/ssl/certs/api.example.org/fullchain.pem
SSLCertificateKeyFile /etc/ssl/certs/api.example.org/privkey.pem
Require all granted
注意:SSLCertificateChainFile 在使用 Let’s Encrypt 的 fullchain.pem 时可省略;若用分开的证书+链文件,则需显式指定 SSLCertificateChainFile。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
避免常见配置陷阱
- 不要在全局或父配置中设置
SSLCertificateFile,否则会被所有虚拟主机继承,导致证书错配 - 禁用默认捕获型虚拟主机:删除或注释掉类似
<virtualhost _default_:443></virtualhost>的配置,防止未匹配请求返回错误证书 - 确保每个
<virtualhost></virtualhost>块都包含完整的 SSL 指令,且ServerName与证书中的域名(含 SAN)严格一致 - Windows 下还需检查 Apache 自带的 OpenSSL DLL(如
libcrypto-1_1-x64.dll)是否存在且路径正确
验证 SNI 是否生效
用 openssl s_client 检查服务端是否按域名返回对应证书:
openssl s_client -connect your-server-ip:443 -servername example.com -showcerts /dev/null | openssl x509 -noout -text | grep "Subject Alternative Name"
替换 example.com 为其他域名再试一次,应看到不同证书中的域名信息。浏览器访问时也应显示对应域名的绿色锁标志,无“证书不匹配”提示。










