Node.js HTTPS 400错误 - 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'

jwe*_*ner 9 ssl https node.js

我正在编写一个Node.js应用程序,它必须从我们的一个内部API请求一些数据.棘手的部分是我请求数据的服务器有一些限制:

  • 请求必须在HTTPS协议(不是HTTP)上进行
  • 必须使用LAN IP地址进行请求,因为域名在内部不起作用
  • 该请求必须看起来是从外部域名请求,因为这是为虚拟主机设置的.

为了做到这一点,我运行了一些看起来像这样的代码:

var headers = {
    Host: externalHostname,
    Hostname: externalHostname,
};

var options = {
    host: InternalIP,
    path: path,
    method: 'GET',
    headers: headers
};

var req = https.request(options, function(res) {
    res.setEncoding('utf8');

    var data = "";

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

    res.on('end', function() {
        //Do something with that data
    });

    res.on('error', function(err) {
            console.log("Error during HTTP request");
            console.log(err);
    });
});

req.end();
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到一个400(你的浏览器发送了一个请求,这个服务器无法理解)错误作为响应.我已经检查过主机名,IP地址和路径名都是正确的(我可以在我的浏览器中测试它们,并且一切都很好).

我做了我的响应变量(res)的输出,并且我收到的authorizationError值为UNABLE_TO_VERIFY_LEAF_SIGNATURE.我不确定那是什么,或者这是我的问题,但它是我能找到的唯一有用的信息.

在这里输出了我的响应变量的完整输出.

关于可能导致这种情况的任何想法?

更新:我想通了!我试图通过传递?PHPSESSID=asdad GET变量来验证服务器,但是他们已经禁用了.我能够通过设置PHPSESSIDCookie标头使其工作.

Tho*_*ggi 14

设置这个 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

  • 这是一个糟糕的想法.如果系统具有适当的CA根(AKA锚)证书,则应该有一种方法来告诉Node有关它们而不是关闭`strict-ssl`. (3认同)

Mik*_* L. 0

从最新的 node.js 中的 tls.js 源代码中查看这一点(我认为您还需要更多内容)

// 认证模式
//
// TLS/SSL 支持多种级别的身份验证。
// 在“man SSL_set_verify”中了解更多相关信息。
//
// 1. 服务器向客户端发送证书,但不请求证书
// 来自客户端的证书。这对于大多数 HTTPS 服务器来说很常见。浏览器
// 可以验证服务器的身份,但服务器不知道是谁
// 客户端是。通常使用 HTTP 通过 HTTP 完成客户端身份验证
// 登录框和 cookie 之类的东西。
//
// 2. 服务器向客户端发送证书,并请求客户端
// 还向它发送一个证书。客户端知道服务器是谁,服务器是谁
// 请求客户端也表明自己的身份。有几个
// 结果:
//
// A) verifyError 返回 null 表示客户端的证书已签名
// 由服务器的 CA 之一。服务器现在知道客户端身份
// 并且客户端已被授权。
//
// B) 由于某种原因,客户端的证书不可接受 -
// verifyError 返回一个指示问题的字符串。服务器可以
// (i) 拒绝客户端或 (ii) 允许客户端作为连接
// 未经授权的连接。
//
// 模式由两个布尔变量控制。
//
// 请求证书
// 如果为 true,则服务器从客户端连接请求证书。为了
// 常见的 HTTPS 情况,用户会希望它为 false,这就是
// 默认为。
//
// 拒绝未授权
// 如果证书因任何原因无效的真实客户端将不会
// 允许建立连接。如果为 false,它们将被简单地标记为
// 未经授权但安全的通信将继续。默认情况下这是
// 错误的。
//

在您的选项中将rejectUnauthorized 设置为 false 并祈祷...如果输出发生变化,请告诉我。

  • 我想你可能对我的情况有点倒退了。这(我相信)是如果我正在创建一个 SSL 服务器 - 该文档中的措辞似乎表明在服务器上设置了 requestCert 和拒绝Unauthorized。然而,我正在尝试从不同的(apache)服务器发出 HTTPS 请求。 (2认同)