【问题标题】:Node.js request CERT_HAS_EXPIREDNode.js 请求 CERT_HAS_EXPIRED
【发布时间】:2013-12-24 08:36:12
【问题描述】:

我正在使用 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 中解决它?

【问题讨论】:

  • 您的 URL 字段末尾缺少“'”。
  • 有没有机会提供端点 URL?
  • 您确认服务器 SSL 证书实际上没有过期吗?也许是时候更新它了。
  • 原来 SSL 证书已过期。无论如何我仍然可以提出这个请求,忽略过期的证书,并得到响应?
  • 如何设置agent: falsestrictSSL: false

标签: javascript node.js express request


【解决方案1】:

解决此问题的最佳方法:

更新证书。这可以使用 Greenlock 免费完成,它通过 Let's Encrypt™ v2 颁发证书

一个less不安全的方法来解决这个问题:

'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) {
  // ...
});

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

其他选项

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

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

对于受信任的对等连接,您还可以添加以下 2 个选项:

agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;

坏主意

不幸的是,process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 甚至被记录在案。它应该只用于调试,并且永远不应该将它变成可以在野外运行的代码。几乎每个在 https 上运行的库都有一种传递代理选项的方法。那些不应该修复的。

【讨论】:

  • [selfSignedRootCaPemCrtBuffer] 是什么意思?如果我知道它在哪里,如何提供缓冲区?
  • 如果您创建了自签名证书,那么您将使用同一自发行根证书的 pem 版本作为缓冲区。
  • 当证书自签名也未过期,但节点抱怨它已过期时有什么想法吗?
【解决方案2】:

在文件顶部添加:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

危险 这会禁用整个 node.js 环境中的 HTTPS / SSL / TLS 检查。请参阅下面使用 https 代理的解决方案。

【讨论】:

  • 请取消将此标记为解决方案。很危险。
  • 每次你使用这个解散解决方案时,一个 NSA 特工都会振作起来。
  • @CoolAJ86 有有效的情况可以使用它。现在,我正在等待更新开发 API 服务器上的过期 SSL 证书。它阻碍了我的工作能力,在此期间忽略 SSL 问题是一个非常好的情况。
  • @CoolAJ86 对于我的用例,您缺少所有上下文,它不适用。抱歉,但你的原教旨主义没有帮助。
  • @CoolAJ86 如果我有一个本地应用程序只与本地环境中的登台服务器建立 HTTPS 连接,那么绝对没有功能差异。因此这是一个可以接受的解决方案。
【解决方案3】:

如果今天有人在使用旧版本的 nodejs 时遇到此问题,这可能是由于 Lets's encrypt 30th sept. 2021 ROOT CA expiry 已在 this answer 中提及。

证书在节点源代码中硬编码,新的 ISRG Root X1 证书为only added in this commit

可以更新他们的节点版本,使用node --use-openssl-ca标志(假设openssl证书是最新的),使用其他答案中提到的http代理解决方案(我没有测试过),或者将process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0设置为一种快速而肮脏的解决方法。

【讨论】:

  • Node.js 的更新(在我的例子中是最新的稳定版本 v16.10.0)成功了!不过,我不确定您是否选择了正确的提交 @max-akn,因为我之前的版本是 v8.17.0,而您共享的提交似乎是从 v8.0.0 开始包含的。
  • 我们的生产应用在 Heroku(Heroku-20 堆栈)上运行并使用 Node 8.9.4。我们还使用 Angular 5.2.11 和 Angular Universal 进行服务器端渲染。从 2021 年 10 月 1 日开始,我们的 Angular Universal https 请求突然停止工作,并且我们的页面没有在服务器端呈现。只需在 package.json “start”脚本中添加“node --use-openssl-ca”标志即可解决问题: "start": "set NODE_ENV=production&& node --use-openssl-ca server.js" 谢谢@Max Akn!
  • 非常感谢 - 这解决了我一直坚持一段时间的问题。我的代码是由一段需要节点 v8 的遗留代码启动的。为了解决这个问题,我使用 n 安装了节点 v14.18.2,然后再次使用 n 将系统的节点版本设置回 v8。但是,一旦安装了 v14,我就可以直接使用 $(n bin 14.18.2) index.js 调用它
【解决方案4】:

这里有一个更简洁的方法来实现CoolAJ86提出的“不太安全”的方法

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});

【讨论】:

  • 如果你从https导入request,那么你甚至不需要agentOptionsrejectUnauthorized可以是直接传递给request的对象的属性。
【解决方案5】:

我认为strictSSL: false 应该(应该有效,即使在 2013 年)有效。所以简而言之就是三种可能的方式:

  1. (很明显)让您的 CA 更新证书,并将其放在您的服务器上!
  2. 更改 request 对象的默认设置:

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

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

【讨论】:

  • 3. 刚刚让我免于通过带有 SSL 拦截的 MITM 代理为插件安装猴子修补 kibana 5。
【解决方案6】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2020-09-20
    • 2019-08-20
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多