gpt4 book ai didi

node.js - nodejs - 证书已过期

转载 作者:行者123 更新时间:2023-12-03 12:16:28 31 4
gpt4 key购买 nike

在我的 nodejs 代码中,我使用 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)
}
}
)
})
}

最近大约 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' }

我通过打开 Safari,访问端点并确认证书过期数据是 ~Apr, 2021 来检查:端点证书(即 https://...)

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

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

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

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

最佳答案

https://support.sectigo.com/Com_KnowledgeDetailPage?Id=kA03l00000117LT它声明现代浏览器将具有 modern USERTRust root这样就不会使用过时的 AddTrust 外部 CA Root 进行验证。

所以,对于 Node 代码,我尝试测试不同的 Node 版本,希望新的 Node 版本会做一些类似新浏览器的事情来更新到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 个案例:
http://testsites.test.certificatetest.com/

结果显示,对于前 3 种情况,nodejs 版本没有任何影响。但是,对于第 4 种情况, Node 10+ 似乎可以解决问题。

结果如下:
  • lts/carbon -> v8.17.0(证书已过期)
  • lts/dubnium -> v10.20.1 (ok)
  • lts/erbium -> v12.17.0 (ok)

  • 我在我的 mac Catalina 10.15.5 上测试

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

    关于node.js - nodejs - 证书已过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62128611/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com