我正在尝试使用以下subjectAltName生成证书:
hostname
*.hostname
hostname.mydomain.local
*.hostname.mydomain.local
我通过 OpenSSL 生成 CSR,然后从 Microsoft Active Directory 证书服务获取证书。证书适用于以下替代名称:
hostname
hostname.mydomain.local
*.hostname.mydomain.local
但是,*.hostname
就是行不通。使用 Curl 进行测试,我得到以下输出:
% curl https://m.example/
curl: (51) SSL: certificate subject name '*.example' does not match target host name 'm.example'
另一方面,如果我将 'm.example' 添加为subjectAltName,那么它可以工作。因此,带有缩短主机名的通配符只是拒绝工作。
个人经验
不久前,我遇到了类似的问题。
我已经为 Windows 和 Linux 服务器设置了一个本地 DNS,并将 .staging 作为 TLD。为了节省为每个虚拟主机创建和签署证书并避免配置新的 IP 地址(非 SNI Web 服务器),我创建了一个密钥和证书,
*.staging
但我尝试的所有客户端(包括 curl)只报告证书主题名称*.staging
每当我尝试使用 TLS 在我们的暂存服务器上加载虚拟主机时,它都与目标主机名不匹配。相关 RFC
我花了很长时间试图弄清楚为什么我生成的通配符证书
*.staging
不起作用。我已经阅读了所有相关的 RFC,但没有一个明确指出这样的通配符证书是无效或非法的。安全堆栈交换答案
在阅读了这个出色的 Security Stack Exchange 答案后,我最终得到了启发。
...
可以为二级域颁发通配符 SSL 证书的公认答案吗?也值得一票。
编辑
我认为除了讲述个人的挫败感之外,除了链接到 RFC 和 Security Stack Exchange 上的相关答案之外,我的回答并没有真正增加太多;我想我会付出更多的努力并搜索 Chromium 和 Firefox 使用的当前相关源代码。
*.intranet
请注意,Chromium 源代码中的注释明确提到不允许使用未知的顶级域(例如)。另外:没有引用可以覆盖此行为的用户可配置选项。
Mozilla 源代码
来自Mozilla 中央 Mercurial 存储库
铬源代码
来自Chromium Git 存储库
registry_controlled_domain.h中的注释也是相关的:
Chromium 和 Mozilla 项目都基于 Mozilla发布的公共后缀列表对有效 TLD的定义。
出于安全原因,HTTPS 客户端应拒绝匹配诸如
*.com
或*.net
(或什至*
)之类的 TLD 通配符:没有单个证书应声明对整个 TLD 的授权。现在客户端应该如何确定 .example 是 TLD(
*.example
禁止匹配)还是短格式(允许匹配)?特别是考虑到每隔一天就会出现新的 TLD,并且任何静态 TLD 列表很快就会过时。所以客户只是拒绝匹配任何通配符
*.XYZ
,并期望在通配符中看到至少两个点。请注意,他们仍应维护通配符黑名单等
*.co.uk *.co.jp
。