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?

在你的文件的顶部添加这个:

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 

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

解决这个问题的最好方法是

续订证书。 这可以免费使用绿色锁一个让我们encryption

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

 '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 ,您至less可以将处理该站点的请求的安全漏洞限制在最小范围内,而不是完全使整个节点进程完全不安全。

其他选项

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

 agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ]; 

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

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

馊主意

不幸的是, process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 甚至有logging。 它应该只用于debugging,不应该把它变成一种在野外运行的代码。 几乎每个在https上运行的库都有一种通过代理选项的方式。 那些不应该被修理。

这是一个更简洁的方法来实现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进程设置环境variablesNODE_TLS_REJECT_UNAUTHORIZED=0来覆盖所有 HTTP(S)代理程序连接的所有证书检查。

尝试临时修改request.js并在每个地方harcode rejectUnauthorized = true,但将证书扩展为长期解决scheme会更好。