我试图从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);
      
    });
});

当前回答

我可以通过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 }

其他回答

尝试添加适当的根证书

这总是比盲目接受未经授权的端点要安全得多,后者只能作为最后的手段。

这可以像添加一样简单

require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();

到你的应用程序。

SSL根ca npm包(这里使用的)对于这个问题是一个非常有用的包。

另一个肮脏的黑客,这将使你所有的请求不安全:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0

我可以通过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 }

这为我工作=>添加代理和'rejectUnauthorized'设置为false

const https = require('https'); //Add This const bindingGridData = async () => { const url = `your URL-Here`; const request = new Request(url, { method: 'GET', headers: new Headers({ Authorization: `Your Token If Any`, 'Content-Type': 'application/json', }), //Add The Below agent: new https.Agent({ rejectUnauthorized: false, }), }); return await fetch(request) .then((response: any) => { return response.json(); }) .then((response: any) => { console.log('response is', response); return response; }) .catch((err: any) => { console.log('This is Error', err); return; }); };

我正在使用nodemailer npm模块。下面的代码解决了这个问题

     tls: {
     // do not fail on invalid certs
     rejectUnauthorized: false
     }