Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs-证书已过期_Node.js_Request_Ssl Certificate - Fatal编程技术网

Node.js nodejs-证书已过期

Node.js nodejs-证书已过期,node.js,request,ssl-certificate,Node.js,Request,Ssl Certificate,在我的nodejs代码中,我使用requestlibrary向站点请求: const httpReq = require("request") function postJSON(uri, data, headers) { if (uri.slice(-1) != "/") { uri += "/" } console.log(`[postJSON] uri: ${uri}`) console.log(`[postJSON] body: ${JSON.stringify

在我的nodejs代码中,我使用
request
library向站点请求:

const httpReq = require("request")
function postJSON(uri, data, headers) {
  if (uri.slice(-1) != "/") {
    uri += "/"
  }

  console.log(`[postJSON] uri: ${uri}`)
  console.log(`[postJSON] body: ${JSON.stringify(data, null, 2)}`)
  console.log("[postJSON] headers", JSON.stringify(headers, null, 2))

  return new Promise((resolve, reject) => {
    httpReq(
      {
        method: "POST",
        uri: uri + Math.floor(Math.random() * 100000000).toString(),
        headers: headers,
        json: data
      }, function (err, resp, body) {
        console.log(`[postJSON] done with error: ${err} -> ${uri}`)

        if (err) {
          reject(err)
        }
        else {
          resolve(body)
        }
      }
    )
  })
}
近30个小时来,我的NodeJS代码一直存在以下问题:

unhandledRejection at: Promise  Promise {
  <rejected> { Error: certificate has expired
    at TLSSocket.<anonymous> (_tls_wrap.js:1108:38)
    at emitNone (events.js:105:13)
    at TLSSocket.emit (events.js:207:7)
    at TLSSocket._finishInit (_tls_wrap.js:638:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:468:38) code: 'CERT_HAS_EXPIRED' } } reason:  { Error: certificate has expired
    at TLSSocket.<anonymous> (_tls_wrap.js:1108:38)
    at emitNone (events.js:105:13)
    at TLSSocket.emit (events.js:207:7)
    at TLSSocket._finishInit (_tls_wrap.js:638:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:468:38) code: 'CERT_HAS_EXPIRED' }
未处理的退出:承诺{
{错误:证书已过期
在TLSSocket.(_tls_wrap.js:1108:38)
在emitNone(events.js:105:13)
在TLSSocket.emit(events.js:207:7)
完成时(包装:638:8)
在TLSWrap.ssl.onhandshakedone(_tls_wrap.js:468:38)代码:'CERT_HAS_EXPIRED'}原因:{错误:证书已过期
在TLSSocket.(_tls_wrap.js:1108:38)
在emitNone(events.js:105:13)
在TLSSocket.emit(events.js:207:7)
完成时(包装:638:8)
在TLSWrap.ssl.onhandshakedone(_tls_wrap.js:468:38)代码:“CERT_已过期”}
我检查了:端点的证书(它是
https://...
)打开Safari,访问端点,并确认证书过期数据为2021年4月

我还尝试使用
curl
axios
库从我的服务器(与我的原始nodejs代码相同的位置)请求端点,错误仍然如上所述抛出。 我试图使用相同的代码从本地机器请求。它起作用了

因此,来自我的服务器的请求和来自本地机器的请求之间可能存在一些差异

什么可能导致这个问题?我该如何解决这个问题

作为临时解决方案,我添加了以下内容:
process.env.NODE\u TLS\u REJECT\u UNAUTHORIZED='0'

谢谢

可能与

我还不确定解决方案是什么。我已经在操作系统中修复了它(wget很高兴),但目前我的节点代码也没有运气。我本来会将此作为评论发布,但我没有足够的声誉。在it状态下,现代浏览器将具有
现代用户信任根
,因此过时的AddTrust外部CA根将不会用于验证

因此,对于节点代码,我尝试测试不同的节点版本,希望新的节点版本能够像新浏览器一样更新到
modern-USERTRust-root

测试代码非常简单

const axios = require('axios');

axios.get('https://some.site.use.addtrust.external.ca.root')
  .then(function (response) {
    console.log(response.data);
  })
  .catch(function (error) {
    console.log(error.message);
  })
我测试了此处显示的所有4个案例:

结果表明,对于前3种情况,nodejs版本不起任何作用。然而,对于第4种情况,节点10+似乎可以解决该问题

结果如下:

  • lts/carbon->v8.17.0(证书已过期)
  • lts/Dubinium->v10.20.1(正常)
  • lts/erbium->v12.17.0(正常)
我在mac Catalina 10.15.5上测试它


对于由USERTrust RSA证书颁发机构通过服务器链从AddTrust外部CA根通过交叉证书签署的CA颁发的证书,使用节点版本10+似乎可以解决此问题。

我想知道服务器是否(位于internet上的其他位置)正在路由到与从本地计算机发出请求时不同的物理目标服务器。您可以从两个位置记录目标主机的IP地址,以防其不同,但由于代理/负载平衡器等原因,这可能还不能说明全部情况。这里找到的解决方案:对我有用,node.js试图与后端断开的证书链对话,我用了这个补丁。路要走,第三节。。。又有一个客户失去了forevah!