繁体   English   中英

Node.js 请求 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,两者都是 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) {
  // ...
});

通过使用带有rejectUnauthorizedagent ,您至少可以将安全漏洞限制在处理该站点的请求上,而不是让您的整个节点进程完全、完全不安全。

其他选项

如果您使用的是自签名证书,则应添加此选项:

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 年也应该有效)有效。 简而言之,是三种可能的方式:

  1. (很明显)让你的 CA 更新证书,然后把它放到你的服务器上!
  2. 更改request对象的默认设置:

    const myRequest = require('request').defaults({strictSSL: false})

    许多内部使用node-request模块也允许注入request ,因此您可以让它们使用您修改过的实例。
  3. (不推荐)通过设置环境变量重写所有证书检查所有HTTP(S)代理连接NODE_TLS_REJECT_UNAUTHORIZED=0为Node.js的过程。

尝试临时修改request.js,并在rejectUnauthorized = true 处硬编码,但最好将证书扩展为长期解决方案。

更新 Nodejs 将强制刷新请求的缓存。

当别无他法时,这对我有用。

今天早上在我的 macbook pro 上调试时,我在使用 Heroku 和本地进行生产时遇到了这个问题。

经过一个小时的调试,这在本地和生产中自行解决。 我不确定是什么修复了它,所以这有点烦人。 当我认为我做了某事时它发生了,但是恢复我假设的修复并没有把问题带回来:(

有趣的是,我的数据库服务 MongoDb 从今天早上开始就出现服务器问题,所以很有可能与它有关。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM