Node.js HTTPS 400错误 - 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'

时间:2012-02-25 01:00:52

标签: node.js ssl https

我正在编写一个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();

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

我输出了我的响应变量(res),并且收到了{error}值{1}}。我不确定那是什么,或者这是我的问题,但这是我能找到的唯一有用的信息。

我输出了我的响应变量here的完整输出。

关于可能导致此问题的任何想法?

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

5 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:1)

我在调试来自我的nodejs服务器的外部api调用中的UNABLE_TO_VERIFY_LEAF_SIGNATURE错误时点击此处。

在验证服务器证书期间出现错误时,会出现此错误。虽然不建议通过以下代码禁用安全性(这也可作为另一个答案),但它有助于验证您是否正在追逐正确的错误。换句话说,如果放置它也不能解决问题,那么代码还有其他问题。

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

在我的情况下,有愚蠢的错误&请求转到localhost本身。即使在完成上述操作后,请求也会失败,这有助于我发现错误。

话虽如此,不建议将其用作解决方案。而是通过设置agent:false&而不是弄清楚如何提供额外的证书。 ca:[fs.readFileSync('root-cert.pem')]个选项。 https.request文档提供了详细信息。在追逐我的错误时,我也发现了一些更有用的资源:

  1. ssl-tools.net网站提供root&中级证书。例如:lives.api.net使用的Baltimore CyberTrust Root
  2. ssl-root-cas module声称提供了热门浏览器使用的其他CA证书。我还没有核实索赔。
  3. openssl s_client -connect apis.live.net:443 - 打印证书链。您需要将最后一个参数(url& port)替换为您要连接的内容。

答案 2 :(得分:0)

从最新的node.js中的tls.js源检查一下(还有更多这是我认为你需要的)

// AUTHENTICATION MODES
//
// There are several levels of authentication that TLS/SSL supports.
// Read more about this in "man SSL_set_verify".
//
// 1. The server sends a certificate to the client but does not request a
// cert from the client. This is common for most HTTPS servers. The browser
// can verify the identity of the server, but the server does not know who
// the client is. Authenticating the client is usually done over HTTP using
// login boxes and cookies and stuff.
//
// 2. The server sends a cert to the client and requests that the client
// also send it a cert. The client knows who the server is and the server is
// requesting the client also identify themselves. There are several
// outcomes:
//
//   A) verifyError returns null meaning the client's certificate is signed
//   by one of the server's CAs. The server know's the client idenity now
//   and the client is authorized.
//
//   B) For some reason the client's certificate is not acceptable -
//   verifyError returns a string indicating the problem. The server can
//   either (i) reject the client or (ii) allow the client to connect as an
//   unauthorized connection.
//
// The mode is controlled by two boolean variables.
//
// requestCert
//   If true the server requests a certificate from client connections. For
//   the common HTTPS case, users will want this to be false, which is what
//   it defaults to.
//
// rejectUnauthorized
//   If true clients whose certificates are invalid for any reason will not
//   be allowed to make connections. If false, they will simply be marked as
//   unauthorized but secure communication will continue. By default this is
//   false.
//

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

答案 3 :(得分:-1)

设置此process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; 修复了superagent的UNABLE_TO_VERIFY_LEAF_SIGNATURE问题。

答案 4 :(得分:-3)

在命令行中尝试:

npm config set strict-ssl false

它在Mac上适用于我。