主题备用名称:VPN 服务器如何被识别
受信任的证书仍可能不适合您的 VPN 主机名。SAN 必须包含客户端所核对的标识形式,即 DNS 名称或 IP 地址。
证书链校验完全正常,您的客户端却拒绝该证书,错误提示名称不匹配。这条消息与谁签发了证书无关。它涉及主题备用名称扩展——该扩展承载证书被允许代表的标识,以及您配置的标识是否以正确形式出现在其中。信任回答谁签发了它,而名称检查回答它属于哪台主机。
客户端实际比较什么
客户端把您的配置转换成一个参考标识:主机名、地址,或协议专用的标识符。随后它在证书中查找该标识,并应用所用协议的匹配规则。只有同一类型的条目才算数,因此 DNS 条目无法满足地址,而且无论有没有人查看证书,比较都会进行。
当该扩展中缺少参考标识时,即使旧的通用名称匹配,检查也会失败。证书可以合法地签发给一家公司,但如果名称从未被包含,它对 vpn.example.com 仍然是错的。即使证书是真实的,失败也属于名称不匹配。
DNS 名称与 IP 地址是独立条目
如果配置文件指向 203.0.113.10,而证书只列出 vpn.example.com,该配置会被拒绝,因为数据包能到达但标识不匹配。DNS 名称与地址字面量作为不同的条目类型存储,彼此从不替代。因此,一个服务可以按地址访问,却仍无法通过使用该地址的配置文件使用。
通配符也遵循自己的规则:一个通配符覆盖单个标签,而不是域下的每个名称。DNS 比较不区分大小写,而其他标识符类型区分,因此屏幕上看似相同的值可能在严格比较中失败。应检查所用标识类型的匹配规则,而不是用肉眼比较字符串。向扩展中添加名称是签发决定,不是客户端设置所能提供的。
检查连接实际使用的证书
读取活动端点实际呈现的材料,而不是从管理页面复制的文件。负载均衡器或替换实例呈现的内容可能与数月前上传的证书不同,而这种差异在控制台中不可见。
openssl s_client -connect vpn.example.com:443 -showcerts </dev/null | openssl x509 -noout -text
主题备用名称块、签发者链和有效期都应放在同一次读取中,因为名称不匹配与过期会产生不同的错误。把该块中的每个名称与配置文件中设置的标识逐字符比较,并记下它属于哪种类型。对端点的地址形式重复执行该命令,可看出证书覆盖两种标识还是只覆盖一种。管理控制台中友好的主题显示不是校验结果,也不能说明扩展包含哪些名称。
通用名称不是现代的真相来源
浏览器和大多数 TLS 库现在忽略通用名称,转而查询该扩展来匹配主机名。有些 VPN 客户端仍先比较通用名称,或在扩展缺失时回退到它,于是一张证书可能在浏览器中通过、在客户端中失败。同一名称检查可能在一个平台上通过、在另一个平台上失败,而证书毫无变化。
在判定证书有误之前,先弄清您的客户端读取哪个字段。同一端点上的两个客户端可能意见不一,这种分歧是关于客户端的信息,而不是关于证书的。
修复签发或配置文件,而不是检查
当配置文件围绕别名构建时,要么把它重新指向文档记录的主机名,要么为别名重新签发证书并在计划窗口内部署。压制警告不是第三种选择,因为检查是唯一把已签名证书绑定到这台特定主机的步骤。移除它意味着同一机构的任何证书都能替代您要访问的服务器。
续期应保留预期名称和用途,而不只是把到期日往后推。丢掉名称的续期就是为下次重启安排的新故障,而且通常毫无预警地到来,因为改动时旧证书仍然有效。
记录预期标识、实际呈现的名称,以及为其签名的链。这份记录让下一次续期成为比较,而不是调查。扩展的定义见 RFC 5280,如需核对某次具体签发可查阅。