我正在编写一个Node.js应用程序,该应用程序必须从我们的一个内部API请求一些数据。棘手的部分是我请求数据的服务器有一些限制:
为了做到这一点,我运行了一些看起来像这样的代码:
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
来使其工作。
答案 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文档提供了详细信息。在追逐我的错误时,我也发现了一些更有用的资源:
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上适用于我。