Node.js TLS双向通信报self signed certificate错误如何解决?
错误根因
DEPTH_ZERO_SELF_SIGNED_CERT错误是客户端TLS握手时校验服务端证书不通过导致的,常见原因如下:
- 服务端证书的
Common Name(CN)字段与客户端访问的主机名不一致:你的客户端访问地址是localhost,如果生成服务端证书时填写的CN不是localhost,就会触发校验失败 - 同一CA签发的证书序列号重复:你生成服务端、客户端证书时都指定了
-set_serial 01,同一个CA签发的所有证书序列号必须唯一,冲突会导致证书校验异常 - 客户端加载的CA证书与签发服务端证书的CA证书不匹配:如果客户端读的
ca.crt不是当初签发server.crt的CA证书,就会把服务端证书识别为未被信任的自签名证书 - 证书文件路径错误:代码中读取证书文件用的是相对路径,若运行代码时的工作目录和证书存放目录不一致,会读取到错误的证书文件
修复方案
正规修复方案(可用于生产环境)
- 校验服务端证书的CN字段
执行命令查看服务端证书的主体信息:
openssl x509 -in server.crt -text -noout | grep "Subject"
确认输出中CN =后面的值为localhost,如果不匹配,重新生成服务端CSR时,Common Name项填写localhost后再签发服务端证书。
- 修正客户端证书的序列号
重新生成客户端证书,将序列号改为唯一值(比如02):
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
- 校验证书链有效性
执行命令验证服务端证书是否可以被当前CA证书信任:
openssl verify -CAfile ca.crt server.crt
如果输出为server.crt: OK则表示匹配,否则需要重新用当前CA签发服务端证书。
- 确认证书路径
运行代码前确认工作目录下存在对应证书文件,也可以将代码中的相对路径改为绝对路径避免读错文件。
临时测试方案
仅本地测试时可以使用,生产环境绝对禁止开启:在客户端的options配置中添加rejectUnauthorized: false,跳过服务端证书校验。
内容的提问来源于stack exchange,提问作者samuel
相关产品推荐
相关产品推荐

