# MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT：Firefox 自签名证书报错

> Firefox 提示 MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT，说明证书是网站自己签发的。这页说明路由器、NAS 上什么时候可以接受，公开网站出现时访客和站长该怎么处理。

Source: https://ssl.sh/zh/errors/mozilla-pkix-error-self-signed-cert/
Last updated: 2026-11-10

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

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

从外部也能看到自签名证书，就是服务器这么配的；外部看到正常证书，就是你所在的网络在拦截。用 [SSL 检测](https://ssl.sh/zh/tools/ssl-checker/) 测一下：

```bash
curl ssl.sh/example.com
```

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

## 原因

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

### 1. 设备自带的默认证书

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

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

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

```bash
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 认证页报错](https://ssl.sh/zh/errors/captive-portal-ssl-error/)。

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

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

| 浏览器 | 显示内容 |
|---|---|
| Firefox | “警告：面临潜在的安全风险”，说明证书因自签名而不受信任 |
| Chrome / Edge / 360 / QQ 浏览器 | [NET::ERR_CERT_AUTHORITY_INVALID](https://ssl.sh/zh/errors/net-err-cert-authority-invalid/) |
| Safari | “此连接非私人连接” |
| curl | `SSL certificate problem: self-signed certificate` |

## 站长怎么修

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

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

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

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

**2. 配置指向正式的证书文件**，而不是占位证书：

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

**3. 内部系统**用内部 CA 签发证书，通过终端管理软件统一下发根证书。临时实验用的话，[自签名证书生成器](https://ssl.sh/zh/tools/self-signed-certificate-generator/) 能生成带正确 SAN 的证书。

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