浏览器

NET::ERR_CERT_AUTHORITY_INVALID 原因和解决方法

作者: · 最后核实

报错信息NET::ERR_CERT_AUTHORITY_INVALID

NET::ERR_CERT_AUTHORITY_INVALID 的意思是:这张证书不是 Chrome 信任的机构签发的。 只有一个网站报,多半是自签名证书、内部 CA 证书或证书链不完整;所有网站都报,几乎都是有软件或网络设备在拦截你的 HTTPS 流量。

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

外部检测也报错,是网站的问题;外部检测正常而本机报错,是你的电脑或网络换掉了证书。先用 SSL 检测 从外部查网站,或者运行:

curl ssl.sh/example.com
  • 检测提示“签发者不受信任”或“自签名”:网站的问题。作为访客,要登录或付款的网站不要绕过警告。
  • 检测显示证书链正常:本地有东西换掉了证书。在 Chrome 地址栏点“不安全”,打开证书查看器,看“颁发者”一栏:写的是某个杀毒软件、你们公司,或者你不认识的名字,就是在你的设备或网络上被拦截了。

原因

只有一个网站报错,多半是前两种原因;所有网站都报,就是第 3 种,有软件或设备在拦截 HTTPS。

1. 自签名或私有 CA 证书

路由器、NAS、测试环境、公司 OA 系统经常用自签名证书或内部 CA 签的证书。用下面的命令确认:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -subject -issuer

subject 和 issuer 完全一样就是自签名。面向公众的网站要换成公开信任的证书(免费的 ACME 证书就行);内网系统应该由 IT 通过域控或终端管理软件统一下发内部根证书。

2. 证书链补不全

服务器只发了站点证书,客户端又拿不到中间证书。Chrome 一般能自己补,但不是每次都行,比如中间证书的下载地址在国内访问不稳定时。用 证书链工具 重新生成完整链。

3. 杀毒软件或公司设备拦截 HTTPS

开了 HTTPS 扫描的安全软件、做 SSL 解密的上网行为管理设备会装自己的根证书。根证书没装好、或者软件生成的证书有问题,就会每个网站都报错。见 杀毒软件 HTTPS 扫描 和 公司 SSL 解密。

4. 根证书被 Chrome 移除或不在 Chrome 的列表里

Chrome 的根证书库和 Windows、macOS 的不完全一样。被 Chrome 停止信任的 CA,或者只在操作系统根库里的根,会出现“只有 Chrome 报错”。对照 Chrome 根证书计划政策 检查签发 CA,必要时换 CA。

5. 设备系统太旧

很老的系统缺少新根证书。升级系统,或者改用自带根证书库的浏览器。

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

Chrome、Edge、360 和 QQ 浏览器都显示 NET::ERR_CERT_AUTHORITY_INVALID,Firefox、Safari、安卓 App 和 curl 各有自己的报错文字。

浏览器 显示内容
Chrome / Edge / 360 极速模式 / QQ 浏览器 “您的连接不是私密连接”,代码 NET::ERR_CERT_AUTHORITY_INVALID
Firefox SEC_ERROR_UNKNOWN_ISSUER 或 MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
Safari “此连接非私人连接”,详情显示证书不受信任
安卓 App Trust anchor for certification path not found(详情)
curl SSL certificate problem: unable to get local issuer certificate

站长怎么修

站长要做两件事:换成公开信任的证书,并发送完整证书链。

1. 换成公开信任的证书。 对外的网站不要用自签名或内部证书。用 certbot:

sudo certbot --nginx -d example.com -d www.example.com

宝塔面板可以在“网站 → 设置 → SSL”里直接申请 Let's Encrypt 证书;阿里云、腾讯云也提供免费 DV 证书,下载时选对应服务器类型(Nginx 选 PEM 格式)。

2. 发送完整证书链。 Nginx 指向包含中间证书的 fullchain 文件:

ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

从云平台下载的证书包里,.pem 或 .crt 文件一般已经是“站点证书 + 中间证书”,不要只复制第一段。

3. 从外部复查。 再跑一次 curl ssl.sh/example.com,证书链应当一直到受信任的根,没有警告。还要用 Firefox 和 curl 测,因为 Chrome 的自动补链会掩盖问题。

4. 内网系统通过域控组策略、终端管理软件统一下发公司根证书,而不是让员工每次点“继续前往”。

常见问题

把网站的证书导入到电脑里,警告就没了,可以这么做吗?

只有你自己能管的系统可以这么做,比如公司内网系统,而且导入的应该是 IT 部门下发的公司根证书。陌生网站让你装的证书一律不要装:装了以后,持有对应私钥的人就能冒充任何网站。

Chrome 能打开,但我的程序报 certificate verify failed,是一回事吗?

多半是,只是方向反过来。Chrome 会自动下载缺失的中间证书(AIA 补全),所以证书链不完整时往往只有 App、curl、Python、Java 报错。见 缺少中间证书。

为什么证书显示是我的杀毒软件颁发的?

杀毒软件为了扫描 HTTPS 内容,会先解密再用自己的根证书给每个网站重新签证书。如果这个根证书不在浏览器的信任列表里,或者软件版本太旧,就会大面积报这个错。升级软件或关闭它的 HTTPS 扫描,见 杀毒软件 HTTPS 扫描。

资料来源

  1. Chromium net_error_list.h
  2. Chrome Root Program Policy
  3. Google Chrome 帮助:修正连接错误