javascript-Node.js请求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中进行修复?

wwwuser asked 2020-08-09T05:34:41Z
5个解决方案
96 votes

解决此问题的最佳方法:

续订证书。 可以使用Greenlock免费进行此操作,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) {
  // ...
});

通过将process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';https结合使用,您至少将安全漏洞限制为处理该站点的请求,而不是使整个节点完全完全不安全地进行处理。

其他选择

如果您使用的是自签名证书,则可以添加以下选项:

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

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

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

馊主意

不幸的是,甚至记录了process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';。 它仅应用于调试,并且绝不能使其成为可能在野外运行的代码。 几乎所有在https上运行的库都可以传递代理选项。 那些不应该解决的问题。

CoolAJ86 answered 2020-08-09T05:35:47Z
44 votes

将其添加到文件顶部:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

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

Dan Kohn answered 2020-08-09T05:34:51Z
17 votes

这是实现CoolAJ86提出的“较少不安全”方法的更简洁方法

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});
NTyler answered 2020-08-09T05:36:09Z
8 votes

我认为NODE_TLS_REJECT_UNAUTHORIZED=0应该(即使在2013年也应该起作用)起作用。 简而言之,是三种可能的方式:

  1. (显而易见)获取您的CA来更新证书,并将其放在服务器上!
  2. 更改NODE_TLS_REJECT_UNAUTHORIZED=0对象的默认设置:

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

    内部使用node-request的许多模块还允许注入request-对象,因此您可以使它们使用修改后的实例。
  3. (不推荐)通过为Node.js进程设置环境变量NODE_TLS_REJECT_UNAUTHORIZED=0覆盖所有HTTP(S)代理连接的所有证书检查。
conny answered 2020-08-09T05:36:52Z
0 votes

尝试临时修改request.js并在所有地方拒绝编码rejectUnauthorized = true,但最好将证书扩展作为一种长期解决方案。

Angular University answered 2020-08-09T05:37:12Z
translate from https://stackoverflow.com:/questions/20433287/node-js-request-cert-has-expired