我试图从jira服务器下载一个文件使用URL,但我得到一个错误。
如何在代码中包含证书进行验证?
错误:
Error: unable to verify the first certificate in nodejs
at Error (native)
at TLSSocket.<anonymous> (_tls_wrap.js:929:36)
at TLSSocket.emit (events.js:104:17)
at TLSSocket._finishInit (_tls_wrap.js:460:8)
我的Nodejs代码:
var https = require("https");
var fs = require('fs');
var options = {
host: 'jira.example.com',
path: '/secure/attachment/206906/update.xlsx'
};
https.get(options, function (http_res) {
var data = "";
http_res.on("data", function (chunk) {
data += chunk;
});
http_res.on("end", function () {
var file = fs.createWriteStream("file.xlsx");
data.pipe(file);
});
});
@sch提供的答案对我帮助很大。我还想补充一些东西。
在开发环境中工作时,您的SSL证书是由您自己的一个自签名证书颁发的(因此不存在中间证书),NODE_EXTRA_CA_CERTS环境变量需要引用这个自签名证书。自签名证书需保存为PEM格式。导出证书后,我做了以下操作:
set NODE_EXTRA_CA_CERTS=C:\rootCert.pem
(值得注意的是,我在Windows上运行node,到PEM的路径没有引用)
使用命令行中的{{node}},我能够确认是否已经解决了这个问题,通过调用:
https.get("https://my.dev-domain.local")
我可以通过mozilla或chrome等浏览器获得证书链。
打开网站,进入网页的证书设置,下载证书链作为文件名(first-chain. txt)。Pem, second-chain.pem),应该是Pem格式
——开始证书
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
......
——结束证书
——开始证书
MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
......
——结束证书
然后在你的nodejs代码中,我在typescript上做了,我添加了2个cas,因为我有2个webserver请求
从“HTTPS”导入HTTPS
从“ssl-root-cas”导入cas
......
扩展缓冲区
addFile(file: string): Buffer[]
}
const caList = cas.create()作为caList
caList.addFile (process.env。` ` certs/first-chain.pem ` `
caList.addFile (process.env。'certs/second-chain.pem')
然后,当我需要使websocket wss连接,我添加代理与新cas列表请求
this.client。connect(KtUrl, undefined, undefined, undefined, {
代理:新的https。代理({
ca: caList
})
})
还必须添加ssl-root-cas文件名ssl-root-cas.d的定义文件。这样打字稿就不会报错
声明模块'ssl-root-cas' {
function create(): string | Buffer | (string | Buffer)[] | undefined
}
几天前我遇到了这个问题,这就是我遵循的方法,它对我很有效。
对我来说,当我试图使用axios获取数据或获取库时,就发生了这种情况,因为我在公司防火墙下,所以我们有某些特定的证书,node js证书存储无法指向。
所以对于我的本地主播,我采用了这种方法。
我在我的项目中创建了一个文件夹,并在文件夹中保存了整个证书链,在我的脚本dev-server(package.json)中,我将此与服务器脚本一起添加,以便node js可以引用路径。
"dev-server":set NODE_EXTRA_CA_CERTS=certificates/certs-bundle.crt
对于我的服务器(不同的环境),我创建了一个新的环境变量,如下所示并添加了它。我使用的是Openshift,但我想这个概念对其他人来说也是一样的。
"name":NODE_EXTRA_CA_CERTS
"value":certificates/certs-bundle.crt
在我的例子中,我没有生成任何证书,因为整个证书链对我来说已经可用了。
这实际上为我解决了这个问题,从https://www.npmjs.com/package/ssl-root-cas
// INCORRECT (but might still work)
var server = https.createServer({
key: fs.readFileSync('privkey.pem', 'ascii'),
cert: fs.readFileSync('cert.pem', 'ascii') // a PEM containing ONLY the SERVER certificate
});
// CORRECT (should always work)
var server = https.createServer({
key: fs.readFileSync('privkey.pem', 'ascii'),
cert: fs.readFileSync('fullchain.pem', 'ascii') // a PEM containing the SERVER and ALL INTERMEDIATES
});
您是否使用axios发送请求并得到此错误?
如果是这样,就把这看作是错误
无法验证第一个证书可能来自axios,与服务器无关。为了解决这个问题,您必须配置axios(或其他请求生成应用程序)以允许未经授权的请求。添加https。代理在请求的配置中设置rejectUnauthorized: false:
import axios from "axios"
import https from "https"
const getCities = async () => {
try {
const result = await axios.get("https://your-site/api/v1/get-cities", {
httpsAgent: new https.Agent({
rejectUnauthorized: false // set to false
})
})
console.log(result.data)
} catch(err) {
console.log(err?.message||err)
}
}
如果您正在使用自定义axios实例,则:
import axios from "axios"
import https from "https"
export const request = axios.create({
baseURL: process.env.BASE_URL,
headers: {
Authorization: cookies.YOUR_ACCESS_TOKEN,
},
httpsAgent: new https.Agent({
rejectUnauthorized: false //set to false
})
})