谷桐羽 2025-09-06 11:05 采纳率: 98.8%
浏览 13
已采纳

问题:如何解决Node.js中出现的Error: self signed certificate?

在使用 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 客户端库(如 axiosnode-fetchrequest)发起 HTTPS 请求时,Node.js 会通过其底层的 OpenSSL 实现来验证服务器证书。

    自签名证书由于没有被任何公共 CA 信任,因此在默认配置下会被拒绝。这在开发和测试环境中非常常见,尤其是在使用本地 HTTPS 服务或私有 API 时。

    二、常见解决方法及其适用场景

    根据不同的使用场景,我们可以选择以下几种方式来处理该问题:

    方法描述适用场景安全性
    禁用 SSL/TLS 验证设置 rejectUnauthorized: falseprocess.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 的信任库中。具体步骤如下:

    1. 获取服务器使用的自签名证书(通常为 .crt.pem 文件)。
    2. 在 Node.js 启动时,通过环境变量或代码加载该证书。
    3. 将证书内容作为 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[连接失败]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 9月6日