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

当前回答

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

其他回答

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

// 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

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

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

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

解决这个问题的另一种方法是使用下面的模块。

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

注:我是上述模块的作者。

几天前我遇到了这个问题,这就是我遵循的方法,它对我很有效。

对我来说,当我试图使用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

在我的例子中,我没有生成任何证书,因为整个证书链对我来说已经可用了。

我遇到过非常罕见的情况,但希望它能帮助到某人:做一个代理服务,代理请求到另一个服务。而且每个请求的错误都是“无法验证第一个证书”,即使我添加了所有预期的证书。

原因很简单-我不小心重新发送也“主机”头。 只是要确保你没有显式地发送“host”头。