nodejs-证书已过期

qua*_*yen 5 request ssl-certificate node.js

在我的 Node.js 代码中,我使用库请求站点request

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)
        }
      }
    )
  })
}
Run Code Online (Sandbox Code Playgroud)

最近大约 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' }
Run Code Online (Sandbox Code Playgroud)

https://...我通过打开 Safari、访问端点并确认证书过期数据检查了:端点证书(即)为 ~2021 年 4 月

我还尝试从我的服务器请求端点使用curlaxios库(与我的原始nodejs代码相同的位置),错误仍然抛出如上。我尝试使用相同的代码从本地计算机发出请求。有用!

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

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

作为临时解决方案,我添加以下内容:process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'

谢谢

use*_*188 6

https://support.sectigo.com/Com_KnowledgeDetailPage?Id=kA03l00000117LT中,它指出现代浏览器将具有,modern USERTRust root以便过时的 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);
  })
Run Code Online (Sandbox Code Playgroud)

我测试了此处显示的所有 4 个案例: http: //testsites.test.certificatetest.com/

结果显示,对于前 3 种情况,nodejs 版本没有任何影响。然而,对于第四种情况,节点 10+ 似乎可以解决该问题。

结果如下:

  • lts/carbon -> v8.17.0(证书已过期)
  • lts/dubnium -> v10.20.1(好的)
  • lts/铒 -> v12.17.0(好的)

我在我的 mac Catalina 10.15.5 上测试了它

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