Nodejs中大家有没有遇到过 UNABLE_TO_VERIFY_LEAF_SIGNATURE 错误?

Nodejs中大家有没有遇到过 UNABLE_TO_VERIFY_LEAF_SIGNATURE 错误?

无法验证的签名,应该是代理的问题

5 回复

Node.js 中大家有没有遇到过 UNABLE_TO_VERIFY_LEAF_SIGNATURE 错误?

当你在使用 Node.js 进行 HTTP 请求时,可能会遇到 UNABLE_TO_VERIFY_LEAF_SIGNATURE 错误。这种错误通常发生在尝试通过 HTTPS 访问某些服务器时,由于 Node.js 无法验证 SSL/TLS 证书链中的某个证书而抛出的错误。

原因

这个错误通常是由于以下几种原因之一造成的:

  1. 中间人攻击(Man-in-the-Middle Attack):虽然这种情况比较少见,但也不能完全排除。
  2. 代理问题:如果你使用了代理服务器,代理服务器可能没有正确配置以支持客户端对目标服务器的 SSL 验证。
  3. 自签名或不受信任的证书:如果目标服务器使用的是自签名证书或者不受信任的证书颁发机构(CA),Node.js 默认会拒绝连接。

解决方法

一种解决办法是禁用 SSL 证书验证,但这仅适用于开发环境或测试环境,因为这会降低安全性。

const https = require('https');

const options = {
    hostname: 'example.com',
    port: 443,
    path: '/',
    method: 'GET',
    rejectUnauthorized: false, // 禁用 SSL 证书验证
    agent: false
};

const req = https.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(data);
    });
});

req.on('error', (e) => {
    console.error(`请求过程中发生错误:${e.message}`);
});

req.end();

请注意,上面的代码禁用了 SSL 证书验证 (rejectUnauthorized: false)。这在生产环境中是不推荐的,因为它会使你的应用暴露于安全风险之中。

更好的做法

更好的做法是在生产环境中安装正确的根证书,或者配置你的代理服务器以支持 SSL 验证。你也可以将受信任的 CA 证书添加到 Node.js 的信任库中,从而允许它验证目标服务器的证书。

const https = require('https');
const fs = require('fs');

const options = {
    hostname: 'example.com',
    port: 443,
    path: '/',
    method: 'GET',
    ca: fs.readFileSync('/path/to/ca-certificate.pem'), // 添加 CA 证书
    rejectUnauthorized: true // 保持 SSL 证书验证开启
};

const req = https.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log(data);
    });
});

req.on('error', (e) => {
    console.error(`请求过程中发生错误:${e.message}`);
});

req.end();

通过这种方式,你可以确保应用程序的安全性,同时仍然能够与目标服务器建立安全连接。


这是因为请求网站根证书没有经过验证所致 http://yoyo.play175.com/p/205.html 做http请求的时候将options的rejectUnauthorized参数设置为false 即可

后来都没遇到过了… 先记下

是的. 通过代理的时候, 走HTTPS需要注意下.

在Node.js开发过程中,确实有一些开发者会遇到UNABLE_TO_VERIFY_LEAF_SIGNATURE错误。这个错误通常发生在尝试与使用自签名证书或不受信任的SSL证书的服务器进行通信时。当你通过代理服务器连接时,这个问题可能会变得更加复杂。

为了解决这个问题,你可以设置Node.js忽略SSL证书验证。请注意,这种方法仅适用于测试环境,因为绕过SSL验证会使你的应用程序暴露于中间人攻击的风险之中。

示例代码:

const https = require('https');
const requestOptions = {
    hostname: 'example.com',
    port: 443,
    path: '/',
    method: 'GET',
    rejectUnauthorized: false, // 忽略SSL证书验证
};

const req = https.request(requestOptions, (res) => {
    console.log(`状态码: ${res.statusCode}`);
    res.on('data', (chunk) => {
        console.log(`响应数据: ${chunk}`);
    });
});

req.on('error', (e) => {
    console.error(`请求失败: ${e.message}`);
});

req.end();

在上面的代码示例中,我们设置了rejectUnauthorized: false来忽略SSL证书验证。在实际生产环境中,请确保使用有效的SSL证书,并正确处理证书验证。

回到顶部