在使用 Node.js 进行 HTTPS 请求时,开发者常常会遇到 `Error: self signed certificate` 错误。该问题通常出现在请求访问使用自签名证书的 HTTPS 服务时,Node.js 默认的安全策略拒绝接受未经受信 CA 签名的证书,从而导致连接中断。此类错误在开发、测试环境中尤为常见,尤其是在使用本地 HTTPS 服务或私有 API 时。解决此问题的方法包括:临时禁用 SSL/TLS 验证(不推荐用于生产环境)、将自签名证书添加到 Node.js 的信任库、或使用 `rejectUnauthorized` 选项跳过证书校验。开发者应根据具体场景选择合适的解决方案,以确保安全性与功能正常。
1条回答 默认 最新
杨良枝 2025-09-06 11:05关注Node.js HTTPS 请求中 `self signed certificate` 错误的深度解析与应对策略
在 Node.js 开发过程中,尤其是在进行 HTTPS 请求时,开发者经常会遇到如下错误信息:
Error: self signed certificate这个错误通常发生在访问使用自签名证书的 HTTPS 服务时。Node.js 默认的安全策略会拒绝接受未经受信 CA(证书颁发机构)签名的证书,从而导致连接中断。
一、问题现象与原理分析
当使用
https模块或第三方 HTTP 客户端库(如axios、node-fetch或request)发起 HTTPS 请求时,Node.js 会通过其底层的 OpenSSL 实现来验证服务器证书。自签名证书由于没有被任何公共 CA 信任,因此在默认配置下会被拒绝。这在开发和测试环境中非常常见,尤其是在使用本地 HTTPS 服务或私有 API 时。
二、常见解决方法及其适用场景
根据不同的使用场景,我们可以选择以下几种方式来处理该问题:
方法 描述 适用场景 安全性 禁用 SSL/TLS 验证 设置 rejectUnauthorized: false或process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'开发、测试环境快速绕过证书问题 极低,不适用于生产 将自签名证书添加到信任库 手动将证书导入 Node.js 使用的信任库中 内部服务调用、测试环境 中等,推荐方式 使用代理中间层 通过 Nginx、中间服务代理请求,完成证书验证 生产环境安全访问私有 HTTPS 服务 高,适合长期使用 三、代码示例:临时跳过证书验证
以下是一个使用
https模块发起请求并跳过证书验证的示例:const https = require('https'); https.get('https://localhost:3000', { rejectUnauthorized: false }, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { console.log(data); }); }).on('error', (err) => { console.error(err); });⚠️ 注意:该方法仅适用于本地开发环境,不建议在生产环境中使用。
四、进阶方案:将自签名证书添加到信任链
为了更安全地解决该问题,可以将自签名证书添加到 Node.js 的信任库中。具体步骤如下:
- 获取服务器使用的自签名证书(通常为
.crt或.pem文件)。 - 在 Node.js 启动时,通过环境变量或代码加载该证书。
- 将证书内容作为
ca参数传入请求选项中。
const fs = require('fs'); const https = require('https'); const ca = fs.readFileSync('path/to/cert.pem'); https.get('https://localhost:3000', { ca: ca }, (res) => { // 处理响应 });五、流程图:HTTPS 请求中的证书验证流程
graph TD A[发起 HTTPS 请求] --> B{证书是否受信任?} B -- 是 --> C[建立安全连接] B -- 否 --> D[抛出 self signed certificate 错误] D --> E{是否设置 rejectUnauthorized?} E -- 是 --> F[忽略错误,继续连接] E -- 否 --> G[连接失败]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 获取服务器使用的自签名证书(通常为