servername 不参与双向认证,但必须与客户端访问域名一致以确保正确路由到启用 sslverifyclient require 的虚拟主机;否则会导致认证失效或证书校验失败。

ServerName 本身不参与双向认证逻辑,它只是告诉 Apache 这个虚拟主机响应哪个域名的请求。在双向认证场景中,它的作用是确保 HTTPS 请求能正确路由到启用了 SSLVerifyClient require 的那个 <virtualhost></virtualhost> 块——也就是说,它必须和客户端实际访问的域名一致,否则 TLS 握手可能失败或证书校验被跳过。
ServerName 必须匹配客户端访问的域名
浏览器或 curl 访问时用的是 https://api.example.com:443,那么 ServerName 就得写成:
ServerName api.example.com
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
如果写成 ServerName localhost 或留空,而客户端又用域名访问,Apache 可能选错虚拟主机(尤其多个 HTTPS 站点共存时),导致:
- 加载了没配
SSLVerifyClient require的配置,双向认证失效 - 服务端证书的 CN/SAN 不匹配,浏览器报“证书不可信”,连接中断,根本走不到客户端证书验证环节
配合双向认证的最小有效写法
以下片段放在 <virtualhost></virtualhost> 内即可生效(注意路径、权限、CA 文件纯净性等前提已满足):
ServerName admin.internal.company
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/ssl/server.key
SSLCACertificateFile /etc/httpd/ssl/client-ca.pem
SSLVerifyClient require
SSLVerifyDepth 2
DocumentRoot /var/www/admin
这里 admin.internal.company 是真实部署的管理后台域名,不是占位符。客户端必须用这个域名发起请求,TLS SNI 才能命中该配置,后续的证书校验才会执行。
别踩这些坑
-
不要用 IP 地址当 ServerName:如
ServerName 192.168.1.100。多数客户端证书的 SAN 或 CN 不含 IP,校验会失败;且部分 OpenSSL 版本对 IP 类型 SubjectAltName 支持不一致 -
别忽略 ServerAlias:如果支持多个域名访问(如
admin.company和manage.company),需补上:ServerAlias manage.company
否则只匹配第一个域名 - HTTPS 下禁用 HTTP 回退:确保没有同时监听 80 端口并重定向到该域名的非 TLS 配置,否则攻击者可绕过证书校验










