Node.js request CERT_HAS_EXPIRED

Node.js request CERT_HAS_EXPIRED

本文关键字:HAS EXPIRED CERT js request Node      更新时间:2024-04-22

我正在使用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) {
  // ...
});

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

其他选项

如果你使用的是自签名证书,你会添加这个选项:

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

  1. (显而易见)让你的CA续订证书,并将其放在你的服务器上
  2. 更改request对象的默认设置:

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

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

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

这对我来说很有效,而其他什么都没有。

尝试在任何地方临时修改request.js和harcode rejectUnauthorized=true,但最好将证书作为长期解决方案进行扩展。