为何Firefox在OpenWRT LUCI场景下遇自签名通配符证书报SSL_ERROR_BAD_CERT_DOMAIN?
我之前帮朋友排查过几乎一模一样的问题,Firefox 58这类老版本对通配符SSL证书的校验规则确实比Chrome、Edge要严格不少,哪怕CA已经被全局信任也会出问题。咱们一步步来排查解决:
1. 检查证书的Subject Alternative Name(SAN)字段
这是最常见的原因:Firefox在较老版本中,强制要求通配符证书必须包含SAN字段,哪怕你在Common Name(CN)里填了*.your-router-domain也不行。很多人生成证书时只设置了CN,漏掉了SAN,就会触发这个错误。
你可以用openssl命令验证证书里有没有正确的SAN:
openssl x509 -in /path/to/your/certificate.crt -text -noout | grep -A 3 "Subject Alternative Name"
如果输出里没有DNS:*.your-router-domain(比如DNS:*.router.local),说明证书不符合Firefox的要求,需要重新生成。
2. 确认域名层级是否符合Firefox的通配符规则
Firefox不允许通配符跨多级域名匹配:
- 比如你的证书是
*.router.local,它只能匹配一级子域名(比如luci.router.local) - 不能匹配多级子域名(比如
admin.luci.router.local)
检查你访问LUCI时用的域名,是不是超出了通配符的匹配范围。如果是多级域名,要么修改访问域名,要么生成包含该多级域名的证书(或者添加到SAN里)。
3. 清理Firefox的旧证书例外
有时候哪怕CA已经被信任,Firefox之前可能保存过该域名的错误证书例外,导致冲突。你可以这么操作:
- 打开Firefox,输入
about:preferences#privacy进入隐私设置 - 找到「证书」板块,点击「查看证书」
- 切换到「服务器」标签,找到和你的路由器域名相关的条目,全部删除
- 重启Firefox后再尝试访问
4. 重新生成符合规范的通配符证书
如果上面的检查都没问题,建议重新生成一份符合Firefox要求的证书。这里给你一套完整的openssl命令示例(替换成你的域名):
# 1. 生成CA根证书(如果还没生成的话) openssl req -new -x509 -days 3650 -keyout ca.key -out ca.crt -subj "/CN=My Router Root CA" # 2. 生成路由器证书的私钥和请求文件 openssl req -new -keyout router.key -out router.csr -subj "/CN=*.router.local" # 3. 创建扩展配置文件,添加SAN字段(关键) echo "subjectAltName = DNS:*.router.local, DNS:router.local" > extfile.cnf # 4. 用CA根证书签署路由器证书 openssl x509 -req -in router.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out router.crt -days 3650 -extfile extfile.cnf
生成完成后,把router.crt和router.key替换OpenWRT uHTTPd配置里的证书路径,重启uHTTPd服务:
/etc/init.d/uhttpd restart
5. 验证新证书
再次用openssl查看新证书的SAN字段,确认已经包含正确的DNS条目,然后重新导入CA证书到所有浏览器(如果之前的CA证书没变可以跳过),再用Firefox访问LUCI应该就能正常了。
内容的提问来源于stack exchange,提问作者Michael Uray

