Node.js request CERT_HAS_EXPIRED
Node.js request CERT_HAS_EXPIRED
我正在使用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中修复它吗?
解决此问题的最佳方法:
续订证书。这可以使用Greenlock免费完成,Greenlock通过Let's颁发证书;加密™nbsp;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 ];
对于受信任的对等连接,您还可以添加以下2个选项:
agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;
坏主意
不幸的是,process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
甚至被记录了下来。它应该只用于调试,而不应该将其放入在野外运行的代码中。几乎每个运行在https
之上的库都有一种传递代理选项的方法。那些不应该修复的。
将其添加到文件顶部:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
危险这将禁用整个node.js环境中的HTTPS/SSL/TLS检查。请参阅下面使用https代理的解决方案。
如果今天有人在使用旧版本的nodejs时遇到这个问题,这可能是由于Lets加密2021年9月30日ROOT CA到期已经在这个答案中提到。
证书被硬编码在节点源代码中,并且新的ISRG Root X1证书仅在该提交中添加。
可以更新他们的节点版本,使用node --use-openssl-ca
标志(假设openssl证书是最新的),使用其他答案中提到的http代理解决方案(我没有测试它),或者将process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0
设置为快速而肮脏的解决方案。
这里有一种更简洁的方法来实现CoolAJ86 提出的"不太安全"的方法
request({
url: url,
agentOptions: {
rejectUnauthorized: false
}
}, function (err, resp, body) {
// ...
});
我认为strictSSL: false
应该(即使在2013年也应该)工作。简而言之,有三种可能的方式:
- (显而易见)让你的CA续订证书,并将其放在你的服务器上
- 更改
request
对象的默认设置:const myRequest = require('request').defaults({strictSSL: false})
许多在内部使用node-request
的模块也允许注入request
-对象,因此您可以让它们使用您修改过的实例 - (不推荐)通过设置Node.js进程的环境变量
NODE_TLS_REJECT_UNAUTHORIZED=0
,覆盖所有HTTP(S)代理连接的证书检查
更新Nodejs将强制刷新请求的缓存。
这对我来说很有效,而其他什么都没有。
尝试在任何地方临时修改request.js和harcode rejectUnauthorized=true,但最好将证书作为长期解决方案进行扩展。
- Javascript GetElementByID has no value
- Cucumber+Mongoose给了我Schema has'尚未注册型号
- .has() 函数在 if 语句 (jQuery) 中不起作用
- 什么是检查随机字符串I've生成了has't是我以前生成的
- jquery has() 似乎没有按预期工作
- react-click event has empty event.target
- jQuery alter element if has class
- 如何将 jQuery has() 与复选框输入一起使用
- $(this).hasClass('has-success') 总是返回 false
- 未捕获的类型错误:对象 #
没有方法“has” - Backbone.model:对象函数 (a){return new n(a)} 没有方法 'has'
- 将 .has() 与 keyup 事件一起使用
- 依赖关系中“./has!dom-addeventlistener?:./aspect”是什么意思
- Google Analytics Site Speed with siteSpeedSampleRate set has
- Firefox 24 has javascript version 1.5
- JQuery :has(),我需要只选择孩子
- 一起使用 jQuery :has() 和 :contains() 选择器
- 主干片段路由在has:attributes时添加到根
- jQuery - Don't allow click event with parent has somethi
- jQuery if Element has an ID?