浏览器

MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT:Firefox 自签名证书报错

作者: · 最后核实

报错信息MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT

MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT 的意思是:网站出示的证书是它自己给自己签的,没有任何证书颁发机构为它担保。 家里路由器、自己搭的测试服务器出现这个很正常;公开网站出现,就说明服务器配置错了,或者有别人在冒充它应答。

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

从外部也能看到自签名证书,就是服务器这么配的;外部看到正常证书,就是你所在的网络在拦截。用 SSL 检测 测一下:

curl ssl.sh/example.com
  • 检测也看到自签名证书:服务器就是这么配的。你是管理者就换证书;不是的话,不要在上面输入任何信息。
  • 检测看到的是正常 CA 签发的证书:你所在的网络在拦截连接。公共 Wi-Fi 认证页、部分代理和恶意软件都会出示自签名证书。切到手机流量对比一下。

原因

4 种原因里,前 3 种是服务器出示了设备或系统自带的自签名证书,第 4 种是网络拦截。

1. 设备自带的默认证书

路由器、NAS(群晖、威联通等)、服务器管理口、打印机第一次开机都会生成自签名证书。用 IP 或 .local 名访问时,本来也用不了公开证书。

2. Web 服务器的默认占位证书

有些 Linux 发行版会装一个占位证书(比如 Debian 的 ssl-cert-snakeoil)。虚拟主机指向了它,或者真证书加载失败,访客拿到的就是这张占位证书。

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

subject 和 issuer 完全一样,就是自签名。

3. 共享服务器上 SNI 没匹配上

请求的域名没有对应的 server 块,默认站点可能用的是自签名证书。宝塔面板上新建站点没开 SSL 时,访问它的 HTTPS 地址也可能拿到别的站或默认的证书。

4. 被拦截

公共 Wi-Fi 认证页、替 HTTPS 应答的代理可能用自签名证书。见 公共 Wi-Fi 认证页报错。

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

这个代码只出现在 Firefox,Chrome、Edge 等浏览器把同样的问题报成 NET::ERR_CERT_AUTHORITY_INVALID。

浏览器 显示内容
Firefox “警告:面临潜在的安全风险”,说明证书因自签名而不受信任
Chrome / Edge / 360 / QQ 浏览器 NET::ERR_CERT_AUTHORITY_INVALID
Safari “此连接非私人连接”
curl SSL certificate problem: self-signed certificate

站长怎么修

对外网站换成公开 CA 签发的免费证书,内部系统改用内部 CA 签发。

1. 对外的网站一律用公开证书。

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

宝塔面板可在“网站 → 设置 → SSL → Let's Encrypt”里一键申请;也可以用阿里云、腾讯云的免费证书。

2. 配置指向正式的证书文件,而不是占位证书:

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

3. 内部系统用内部 CA 签发证书,通过终端管理软件统一下发根证书。临时实验用的话,自签名证书生成器 能生成带正确 SAN 的证书。

4. 确认结果。 用 curl ssl.sh/example.com 看颁发者是否已经变成公开 CA。

常见问题

家里路由器后台的自签名证书可以接受吗?

可以,前提是你在自己家的网络里、地址是你自己输入的。最好第一次接受前,把证书指纹和路由器设置页里显示的对一下。公开网站的自签名证书不要接受。

公司内部服务器怎么才能不弹警告?

建一个小型内部 CA,用它给服务器签证书,再把 CA 根证书装到需要访问的设备上;服务器有公网域名的话,直接用公开证书更省事。让每个人自己加例外既管不过来,也会让大家养成乱点“继续”的习惯。

一个大网站突然显示自签名证书,是怎么回事?

你和网站之间有别的东西在替网站服务器应答,比如公共 Wi-Fi 认证页、配置错的代理,或者恶意软件。不要继续访问,换个网络对比一下。

家里内网的设备能用上公开证书吗?

有自己的域名就可以。把 nas.example.com 这样的名字解析到设备的内网地址,再用 DNS-01 验证申请证书,这种方式不要求设备能从公网访问。群晖等 NAS 系统可以自动续期这类证书,全家人访问都不会再看到自签名警告。

资料来源

  1. Mozilla Support: Error codes on secure websites
  2. Mozilla Support: What does "Your connection is not secure" mean?
  3. RFC 5280: X.509 certificate profile