浏览器
NET::ERR_CERT_INVALID:证书格式错误或违反规则怎么办
NET::ERR_CERT_INVALIDNET::ERR_CERT_INVALID 的意思是:Chrome 能建立连接,但发现证书本身是坏的,或者违反了它的规则。 这不是日期、域名或签发者的问题(那些有各自的代码),多出现在自己生成的证书、企业内部 CA 和拦截 HTTPS 的软件上。
先判断是网站的问题还是你电脑的问题
SSL 检测也提示证书有问题,就是服务器的证书格式不对;检测正常,就是你的设备或网络换掉了证书。对比 SSL 检测 看到的和你浏览器看到的:
curl ssl.sh/example.com
- 检测也提示证书有问题:服务器上的证书格式不对,只有站长能修。
- 检测显示正常的公开证书:你的设备或网络上有东西换掉了证书,通常是杀毒软件的 HTTPS 扫描、公司代理,或者老版本的拦截产品生成了新版 Chrome 不再接受的证书。见 杀毒软件 HTTPS 扫描。
原因
问题都出在证书本身的结构上,最常见的是手工生成的证书缺扩展或扩展写错。
1. 手工生成的证书缺扩展或扩展写错
有些脚本生成的证书没有 SAN、服务器证书写了 CA:TRUE,或者密钥用途字段互相矛盾。查看方法:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -text | sed -n '/X509v3 extensions/,/Signature Algorithm/p'
重点看 Basic Constraints、Key Usage、Extended Key Usage、Subject Alternative Name 四项。
2. 有无法识别的关键扩展或编码错误
标为 critical 的扩展 Chrome 不认识,或者某个有 bug 的工具生成了错误的 DER 编码,证书就是无效的。用标准工具重新生成。
3. 密钥用途和握手方式不符
密钥用途禁止了握手要用的操作,Chrome 可能报这个代码,也可能报更具体的 ERR_SSL_KEY_USAGE_INCOMPATIBLE。
4. 拦截类产品生成的证书有问题
老版本的 HTTPS 扫描工具、上网行为管理设备生成的证书可能不符合新版 Chrome 的要求。升级产品,或关闭 HTTPS 扫描功能。
5. 本地信任证书的平台规则
苹果对 TLS 证书的要求(必须有 SAN、RSA 至少 2048 位、SHA-2 签名、EKU 含 serverAuth)适用于 Safari 和使用苹果验证器的 App,也是内部证书的一个好基准。
在各浏览器/系统上的样子
Chrome 系浏览器统一报 NET::ERR_CERT_INVALID,Firefox 会按具体问题给出不同的代码。
| 浏览器 | 显示内容 |
|---|---|
| Chrome / Edge / 360 / QQ 浏览器 | “您的连接不是私密连接”,代码 NET::ERR_CERT_INVALID |
| Firefox | 不固定:SEC_ERROR_BAD_DER、SEC_ERROR_INADEQUATE_KEY_USAGE 或 SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION |
| Safari | “此连接非私人连接”,说明证书无效 |
站长怎么修
能用公开证书就用公开证书;必须内部签发时,按公开证书的扩展格式生成。
1. 能用公开证书就用公开证书。 任何 ACME CA 都能免费签发格式规范的证书,宝塔面板一键就能申请。
2. 必须内部签发时,用正规的 CA 结构,服务器证书带上这些扩展:
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr \
-subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:www.example.com"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 200 \
-out server.crt -copy_extensions copy \
-extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth")
-copy_extensions 需要 OpenSSL 3.0 及以上。
3. 检查结果。 用 证书解析 查看新证书,和公开证书对比,再用 curl ssl.sh/example.com 复测。
常见问题
公开网站也会出现 NET::ERR_CERT_INVALID 吗?
很少,因为公开 CA 签发前会自动检查证书格式。公开网站上出现,更多是安全软件或代理把证书换成了有问题的那张。用 curl ssl.sh/example.com 对比一下。
我自签的证书 Firefox 能用,Chrome 却报 NET::ERR_CERT_INVALID,为什么?
Chrome 的证书验证器对结构要求更严。重新生成证书时带上 SAN、basicConstraints=CA:FALSE、keyUsage=digitalSignature、extendedKeyUsage=serverAuth,并且用单独的 CA 证书来签,不要用同一张证书兼做 CA 和服务器证书。
NET::ERR_CERT_INVALID 说明被攻击了吗?
不一定,但单看浏览器判断不了。除非是你自己的系统、而且确定证书是自己做的,否则不要在报这个错的网站上输入账号密码。
内网系统用的是公司 CA 签的证书,最近 Chrome 升级后才开始报这个错,为什么?
Chrome 的证书验证器会随版本逐步收紧规则,过去被容忍的格式问题可能在新版本里变成错误。把证书交给 证书解析 看一遍,重点检查 SAN、密钥用途和基本约束,按上文的模板重新签发即可。如果同时出现 ERR_SSL_KEY_USAGE_INCOMPATIBLE,见 ERR_SSL_KEY_USAGE_INCOMPATIBLE 的修法。