Certbot搭配Apache的通配符SSL证书无法匹配二级子域名如何解决
问题根因
你遇到的证书不匹配问题是SSL通配符证书的固有规则导致的,和Certbot、Apache配置无关:
- 单通配符
*.example.com仅能匹配直接在example.com下的一级子域名,不能跨层级匹配a.b.example.com这类多级子域名 - Let's Encrypt官方不支持签发包含多个通配符的证书(比如
*.*.example.com),所以Certbot才会返回对应的报错,这个限制是CA侧的,不是Certbot的问题
解决方案
方案1:在现有证书中添加指定层级的通配符域名
这是最省事的方案,Let's Encrypt允许单张证书最多添加100个SAN(主体备用名称)条目,你可以把需要用到的多级通配符都加到同一张证书里。
比如你需要支持所有*.test.example.com的子域名,重新执行证书签发命令,把所有需要的域名都带上即可:
certbot certonly --你的DNS插件参数 -d example.com -d *.example.com -d *.test.example.com
如果还有其他二级前缀的子域名需要支持,比如*.prod.example.com,直接在命令后追加-d *.prod.example.com即可,只要总数不超过100都可以正常签发。
签发完成后修改Apache配置的ServerAlias条目,匹配对应层级的域名:
ServerName example.com ServerAlias *.example.com *.test.example.com *.prod.example.com
重启Apache后就可以正常访问多级子域名了。
方案2:分层签发单独的证书
如果你的多级子域名分属不同业务,需要单独管理证书,可以给每个二级前缀单独签发通配符证书:
比如给test二级域单独签发证书:
certbot certonly --你的DNS插件参数 -d *.test.example.com
然后在Apache中配置对应虚拟主机,指定该证书的路径即可,DNS插件会自动识别需要添加的验证记录层级,不需要手动调整插件生成的JSON文件。
方案3:直接添加具体的多级子域名到证书
如果用到的多级子域名数量少且固定,可以直接把完整域名加到证书里,比如:
certbot certonly --你的DNS插件参数 -d example.com -d *.example.com -d test1.test.example.com -d test2.test.example.com
这种方式不需要加通配符,适合临时使用的场景。
内容的提问来源于stack exchange,提问作者TVA van Hesteren
相关产品推荐
相关产品推荐

