浏览器

SEC_ERROR_INADEQUATE_KEY_USAGE:Firefox 报错原因和解决方法

作者: · 最后核实

报错信息SEC_ERROR_INADEQUATE_KEY_USAGE

SEC_ERROR_INADEQUATE_KEY_USAGE 的意思是:证书链里有一张证书“没有权限”做它正在做的事。 每张证书都可以在密钥用途扩展里声明允许的用途;服务器证书不能为握手签名,或者 CA 证书不能给别的证书签名,Firefox 就会拒绝连接。

先判断是网站的问题还是你电脑的问题

SSL 检测 能看出服务器证书的密钥用途对不对:有问题就要重签;检测正常而只有 Firefox 报错,就查 Firefox 里导入的证书。命令行检测:

curl ssl.sh/example.com
  • 检测提示密钥用途有问题,或者网站用的是自制证书:证书要重新签发,访客这边没有安全的办法。
  • 检测正常,别的浏览器也正常:查 Firefox。打开“设置 → 隐私与安全 → 证书 → 查看证书”,在 “证书颁发机构” 选项卡里找有没有以这个网站或设备命名的证书。服务器证书被当作 CA 导入到这里,是常被报告的原因;删掉它,用网站正常的证书即可。

原因

这个报错有 5 种原因,多数出在证书的密钥用途(Key Usage)扩展上,少数是 Firefox 配置文件里的旧数据。

1. 服务器证书缺 digitalSignature

现代 TLS 密钥交换(ECDHE)要求服务器对握手数据签名。密钥用途里只写了 keyEncipherment 的证书就会失败。查看方法:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -ext keyUsage,extendedKeyUsage,basicConstraints

2. CA 证书缺 keyCertSign

内部 CA 建的时候密钥用途里没写 keyCertSign,它签出来的证书就都无效,Firefox 会拒绝它下面的所有证书。

3. 服务器证书被当成 CA 导入

有人为了消除警告,把网站证书导入到了“证书颁发机构”选项卡,Firefox 就把它当成 CA。它没有 keyCertSign,就会报这个错。企业内网里给员工电脑“批量导证书”时,最容易出现这种误操作。

4. 设备证书的密钥用途不常规

部分路由器、打印机、网络设备生成的证书,密钥用途是给其他场景设计的。升级固件,或者上传一张正确生成的证书。

5. 配置文件里的残留数据

配置文件 cert9.db 里的旧例外或旧导入证书可能和新证书冲突。在 about:profiles 新建配置文件测试。

在各浏览器/系统上的样子

Chrome 把密钥用途问题报成 ERR_SSL_KEY_USAGE_INCOMPATIBLE 或 NET::ERR_CERT_INVALID,OpenSSL 报 unsuitable certificate purpose。

浏览器 显示内容
Firefox “建立安全连接失败”或“警告:面临潜在的安全风险”,代码 SEC_ERROR_INADEQUATE_KEY_USAGE
Chrome / Edge / 360 / QQ 浏览器 ERR_SSL_KEY_USAGE_INCOMPATIBLE 或 NET::ERR_CERT_INVALID
Safari “此连接非私人连接”
OpenSSL 验证时报 unsuitable certificate purpose

站长怎么修

公开 CA 签发的证书自带正确的密钥用途;内部证书要带上 digitalSignature(服务器证书)或 keyCertSign(CA 证书)重新签发。

1. 能用公开证书就用公开证书。 公开 CA 签发的证书默认就带正确的密钥用途,宝塔面板或云厂商的免费证书都可以。

2. 内部证书带上正确扩展重新签发。 服务器证书:

printf "basicConstraints=CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=DNS:example.com\n" > server.ext
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -days 200 -extfile server.ext -out server.crt

CA 证书要带 basicConstraints=critical,CA:TRUE 和 keyUsage=critical,keyCertSign,cRLSign。

3. 部署前先解析检查。 把结果粘到 证书解析 里逐项确认扩展,再用 curl ssl.sh/example.com 和 Firefox 测试。

常见问题

TLS 服务器证书的密钥用途应该怎么设?

digitalSignature 是现代 ECDHE 握手和所有 ECDSA 密钥必需的;RSA 证书传统上还会带 keyEncipherment。扩展密钥用途要包含 serverAuth,basicConstraints 要写 CA:FALSE。

直接删掉 Firefox 的证书数据库能解决吗?

有用户反馈,在关闭 Firefox 后删除配置文件夹里的 cert9.db 能消除这个错误,因为它清掉了残留的导入证书和例外。但这也会删掉你自己导入的所有证书,所以先试着在“设置 → 证书 → 查看证书”里删掉那张具体的证书。

Chrome 会显示同样的错误吗?

Chrome 会把密钥用途问题报成 ERR_SSL_KEY_USAGE_INCOMPATIBLE 或 NET::ERR_CERT_INVALID,取决于版本以及证书是否链到本地安装的根证书。

可以给这个错误加例外吗?

Firefox 通常不为这个代码提供例外,这是有意的:证书正被用于签发者不允许的用途。应该修证书,而不是绕过。

资料来源

  1. Mozilla Support: Error codes on secure websites
  2. RFC 5280 4.2.1.3 节:Key Usage
  3. RFC 5280 4.2.1.12 节:Extended Key Usage