![](/img/trans.png)
[英]CERT_HAS_EXPIRED: node.js and https request using create-react-app
[英]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,两者都是 output 相同的 CERT_HAS_EXPIRED 错误。 是什么导致了这个问题,有没有办法在 nodejs 中修复它?
更新证书。 这可以使用Greenlock免费完成,它通过 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) {
// ...
});
通过使用带有rejectUnauthorized
的agent
,您至少可以将安全漏洞限制在处理该站点的请求上,而不是让您的整个节点进程完全、完全不安全。
如果您使用的是自签名证书,则应添加此选项:
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's encrypt 30th sept. 此答案中已提到2021 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 年也应该有效)有效。 简而言之,是三种可能的方式:
request
对象的默认设置:const myRequest = require('request').defaults({strictSSL: false})
node-request
模块也允许注入request
,因此您可以让它们使用您修改过的实例。NODE_TLS_REJECT_UNAUTHORIZED=0
为Node.js的过程。尝试临时修改request.js,并在rejectUnauthorized = true 处硬编码,但最好将证书扩展为长期解决方案。
更新 Nodejs 将强制刷新请求的缓存。
当别无他法时,这对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.