REST服务证书校验报x509: certificate signed by unknown authority错误
报错根因
x509: certificate signed by unknown authority 触发的核心原因是:你自行生成的自签名证书,不在操作系统/客户端程序的受信任根证书列表中,TLS校验环节无法找到可信的证书签发主体,直接终止连接。
另外有90%的本地自签名证书场景还会踩第二个坑:新版TLS客户端(Chrome 58+、Go 1.15+、Python 3.7+等)已经不再信任仅设置了Common Name字段的证书,必须携带Subject Alternative Name(SAN)扩展才能通过校验,很多旧教程生成证书的步骤漏掉了这个配置,哪怕加了系统信任也会报错。
完整解决步骤
1. 生成符合规范的localhost自签名证书
先在当前目录创建openssl配置文件localhost.cnf,内容如下:
[req] default_bits = 2048 distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] C = CN ST = LocalDev L = LocalDev O = LocalDev CN = localhost [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1 IP.2 = ::1
执行以下命令生成有效期10年的证书和无加密私钥:
openssl req -x509 -newkey rsa:2048 -nodes -keyout localhost.key -days 3650 -out localhost.crt -config localhost.cnf
执行完成后当前目录会生成localhost.key(私钥,给服务端配置用)和localhost.crt(证书文件,用于信任配置)。
2. 将证书加入Ubuntu系统级信任
执行以下命令把证书导入系统受信任根证书库:
sudo cp localhost.crt /usr/local/share/ca-certificates/localhost.crt sudo update-ca-certificates
命令执行成功后终端会输出1 added, 0 removed; done.的提示,代表系统级信任配置完成。
3. 适配不读取系统证书库的特殊环境
部分程序会维护独立的证书存储,需要单独配置信任:
- Go编写的服务/客户端:默认读取系统证书库,配置完系统信任后重启程序即可生效;如果代码里自定义了证书池,需要通过
x509.CertPool.AppendCertsFromPEM()方法手动加载localhost.crt。 - Python 生态(requests、pip等):可以在请求时传入
verify="/path/to/localhost.crt"参数跳过校验报错,也可以将localhost.crt的内容追加到certifi包对应的cacert.pem文件中实现全局信任。 - 桌面浏览器:Chrome、Edge、Firefox均使用独立证书库,需要打开浏览器设置-隐私和安全-证书管理页面,将
localhost.crt导入到「受信任的根证书颁发机构」分组,重启浏览器后生效。 - Docker容器:需要在构建镜像时把
localhost.crt拷贝到容器内的/usr/local/share/ca-certificates/目录,执行update-ca-certificates更新容器内证书库即可。
常见避坑提示
- 生成私钥时务必加
-nodes参数,否则私钥会被密码加密,服务启动时会卡在密码输入环节无法自动运行。 - 配置完系统信任后记得重启对应的服务/客户端/终端,旧进程不会加载更新后的证书库。
- 自签名证书仅适合本地开发调试使用,绝对不要用于生产对外服务场景。
- 如果用curl测试仍然报错,可以加
-v参数查看具体校验环节,确认是证书信任问题还是SAN字段缺失问题。
内容的提问来源于stack exchange,提问作者Prajwal Bhagat
相关产品推荐
相关产品推荐

