当前位置: 首页 > 知识库问答 >
问题:

错误:无法验证nodejs中的第一个证书

柳鸿博
2023-03-14

我试图使用URL从jira服务器下载一个文件,但我遇到了一个错误。如何在代码中包含证书以进行验证?

错误:

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);
      
    });
});

共有3个答案

华萧迟
2023-03-14

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

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
松铭
2023-03-14

无法验证第一个证书

证书链不完整。

这意味着您连接到的网络服务器配置错误,并且没有在它发送给您的证书链中包含中间证书。

最有可能的情况如下:

  1. 服务器证书-html" target="_blank">存储由中间层签名的证书

中间证书应与服务器证书一起安装在服务器上。
根证书嵌入到软件应用程序、浏览器和操作系统中。

提供证书的应用程序必须发送完整的链,这意味着服务器证书本身和所有中介。客户端应该知道根证书。

去https://incomplete-chain.badssl.com使用浏览器。

它不显示任何错误(地址栏中的挂锁是绿色的)。
这是因为如果不是从服务器发送的,浏览器倾向于完成链。

现在,连接到https://incomplete-chain.badssl.com使用节点:

// index.js
const axios = require('axios');

axios.get('https://incomplete-chain.badssl.com')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

日志:“错误:无法验证第一个证书”。

您需要自己完成证书链。

要做到这一点:

1:您需要在中获取缺少的中间证书。pem格式,然后

2a:使用Node\u EXTRA\u CA\u证书扩展Node的内置证书存储

2b:或使用ca选项传递您自己的证书包(中间体和根)。

使用openssl(Git for Windows附带)。

保存远程服务器的证书详细信息:

openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile

我们正在寻找发行者(中间证书是服务器证书的发行者/签名者):

openssl x509 -in logcertfile -noout -text | grep -i "issuer"

它应该为您提供签名证书的URI。下载:

curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

最后,将其转换为。pem

openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text

我正在使用交叉环境设置package.json文件中的环境变量:

"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"

此选项将覆盖节点的内置根CA。

这就是为什么我们需要创建自己的根CA。使用ssl根CA。

然后,创建一个定制的https代理,该代理使用我们的证书包(根和中间)进行配置。发出请求时,将此代理传递给axios。

// index.js
const axios = require('axios');
const path = require('path');
const https = require('https');
const rootCas = require('ssl-root-cas').create();

rootCas.addFile(path.resolve(__dirname, 'intermediate.pem'));
const httpsAgent = new https.Agent({ca: rootCas});

axios.get('https://incomplete-chain.badssl.com', { httpsAgent })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

您可以将证书放在https全局代理上,而不是创建自定义https代理并将其传递给axios

// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
  1. https://levelup.gitconnected.com/how-to-resolve-certificate-errors-in-nodejs-app-involving-ssl-calls-781ce48daded
  2. https://www.npmjs.com/package/ssl-root-cas
  3. https://github.com/nodejs/node/issues/16336
  4. https://www.namecheap.com/support/knowledgebase/article.aspx/9605/69/how-to-check-ca-chain-installation
  5. https://superuser.com/questions/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file/
  6. 如何转换。对。佩姆
年嘉禧
2023-03-14

这永远是一个比盲目接受未经授权的终点更安全的选择,而未经授权的终点只能作为最后手段。

这可以简单地添加

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

到您的应用程序。

SSL根CAs npm包(此处使用)是解决此问题的非常有用的包。

 类似资料:
  • 问题内容: 我正在尝试使用url从jira服务器下载文件,但出现错误。如何在代码中包括证书以验证 错误: 我的Nodejs代码: 问题答案: 尝试添加适当的根证书 这总是比盲目地接受未经授权的端点要安全得多的选择,后者只能被用作最后的手段。 这可以像添加一样简单 到您的应用程序。 该SSL根CA NPM包(这里使用的)是关于这个问题的一个非常有用的包。

  • 当我尝试安装扩展时,出现以下错误: 我已经知道问题是我们的内部网络结构,它用我们自己的SSL证书包装每个SSL证书,而不是每个应用程序都信任我们的证书。 是否可以在Visual Studio代码中设置属性Trust all SSL证书? 谢啦

  • 问题内容: 我在用于通过Gmail发送电子邮件的简单脚本中使用PHPMailer,但遇到“未知错误”(至少对我来说!): SMTP错误:无法验证。错误:SMTP错误:无法验证。 SMTP服务器错误:5.7.1不接受用户名和密码。要了解更多信息,请访问535 5.7.1 http://mail.google.com/support/bin/answer.py?answer=14257 p38sm24

  • 我使用RVM在Ubuntu18.04上安装RubyonRails。ruby-v:2.4。0轨道-v:5.1。3. 我试图运行“bundle install”命令,但发现以下错误。请为我提供最好的解决方案。 无法验证https://rails-assets.org/.的SSL证书可能遇到中间人攻击,但很可能您的系统没有验证所需的CA证书。有关OpenSSL证书的信息,请参见bit.ly/ruby-s

  • 问题内容: 非常奇怪的错误。我使用的是http://developers.facebook.com/docs/authentication/。所以我创建了对fb的请求并传递redirect_uri。我在本地主机上使用测试站点。所以如果我通过 redirect_uri = http://localhost/test_blog/index.php 它工作正常,但如果我通过 redirect_uri =

  • 我有一个简单的登录模型类,几乎没有数据注释验证 View是一个部分View,如下所示: 我相信我已经做了验证消息显示所需的所有事情,但它没有,客户端验证也没有。在母版页的头部区域,我还包括了以下脚本 是什么导致了这个问题?解决办法是什么?