我正在使用Mikeal的请求(https://github.com/mikeal/request)向服务器发出https请求。但是,我一直收到CERT_HAS_EXPIRED的授权错误。
request({
url: 'https://www.domain.com/api/endpoint',
strictSSL: false
}, function(error, response, body) {
if(!error && response.statusCode == 200) {
res.json(JSON.parse(body));
} else {
res.json(response.statusCode, {'error': 'error'})
}
});
我尝试将strictSSL设置为true和false,两者都输出CERT_HAS_EXPIRED的相同错误。导致此问题的原因是什么方法可以在nodejs中修复它?
答案 0 :(得分:87)
续订证书。这可以使用Greenlock免费完成,{{3}}通过Let's Encrypt™v2
颁发证书'use strict';
var request = require('request');
var agentOptions;
var agent;
agentOptions = {
host: 'www.example.com'
, port: '443'
, path: '/'
, rejectUnauthorized: false
};
agent = new https.Agent(agentOptions);
request({
url: "https://www.example.com/api/endpoint"
, method: 'GET'
, agent: agent
}, function (err, resp, body) {
// ...
});
通过agent
使用rejectUnauthorized
,您至少可以将安全漏洞限制在处理该网站的请求中,而不是让您的整个节点完全处理,完全不安全。
如果您使用的是自签名证书,则可以添加此选项:
agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];
对于可信对等连接,您还可以添加以下两个选项:
agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;
遗憾的是process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
甚至记录在案。它应该仅用于调试,并且永远不应该在一些在野外运行的代码中进行调试。几乎每个在https
之上运行的库都有一种传递代理选项的方法。不应该修复那些。
答案 1 :(得分:44)
在文件顶部添加:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
危险这将禁用整个node.js环境中的HTTPS / SSL / TLS检查。请使用下面的https代理查看解决方案。
答案 2 :(得分:15)
这是一种更简洁的方法来实现CoolAJ86提出的“不太安全”的方法
?discrete_scale
答案 3 :(得分:7)
我认为strictSSL: false
应该(应该在2013年工作)。简而言之,有三种可能的方式:
request
对象的默认设置:const myRequest = require('request').defaults({strictSSL: false})
node-request
的模块也允许注入request
- 对象,因此您可以使用已修改的实例。NODE_TLS_REJECT_UNAUTHORIZED=0
,覆盖所有 HTTP(S)代理连接的所有证书检查。 答案 4 :(得分:0)
尝试临时修改request.js并在任何地方harcode rejectUnauthorized = true,但最好将证书扩展为长期解决方案。
答案 5 :(得分:-1)