我试图从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);
});
});
解决这个问题的另一种方法是使用下面的模块。
node_extra_ca_certs_mozilla_bundle
该模块无需任何代码修改,即可生成包含Mozilla信任的所有根证书和中间证书的PEM文件。您可以使用以下环境变量(适用于Nodejs v7.3+),
NODE_EXTRA_CA_CERTS
生成与上述环境变量一起使用的PEM文件。你可以使用以下方法安装模块:
npm install --save node_extra_ca_certs_mozilla_bundle
然后使用环境变量启动节点脚本。
NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem node your_script.js
使用生成的PEM文件的其他方法如下:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
注:我是上述模块的作者。
这实际上为我解决了这个问题,从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获取数据或获取库时,就发生了这种情况,因为我在公司防火墙下,所以我们有某些特定的证书,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
在我的例子中,我没有生成任何证书,因为整个证书链对我来说已经可用了。