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

当前回答

尝试添加适当的根证书

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

这可以像添加一样简单

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

到你的应用程序。

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

其他回答

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

对于无法验证nodejs中的第一个证书,需要拒绝未经授权的证书

 request({method: "GET", 
        "rejectUnauthorized": false, 
        "url": url,
        "headers" : {"Content-Type": "application/json",
        function(err,data,body) {
    }).pipe(
       fs.createWriteStream('file.html'));

您是否使用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
  })
})

尝试添加适当的根证书

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

这可以像添加一样简单

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

到你的应用程序。

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

您可以全局禁用证书检查-无论您使用哪个包来发出请求-就像这样:

// Disable certificate errors globally
// (ES6 imports (eg typescript))
//
import * as https from 'https'
https.globalAgent.options.rejectUnauthorized = false

Or

// Disable certificate errors globally
// (vanilla nodejs)
//
require('https').globalAgent.options.rejectUnauthorized = false

当然,您不应该这样做——但这对于调试和/或非常基本的脚本编写非常方便,您完全不需要关心证书是否正确验证。