我试图使用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);
});
});
另一个肮脏的黑客,这将使您的所有请求都不安全:
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
无法验证第一个证书
证书链不完整。
这意味着您连接到的网络服务器配置错误,并且没有在它发送给您的证书链中包含中间证书。
最有可能的情况如下:
中间证书应与服务器证书一起安装在服务器上。
根证书嵌入到软件应用程序、浏览器和操作系统中。
提供证书的应用程序必须发送完整的链,这意味着服务器证书本身和所有中介。客户端应该知道根证书。
去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;
这永远是一个比盲目接受未经授权的终点更安全的选择,而未经授权的终点只能作为最后手段。
这可以简单地添加
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,如下所示: 我相信我已经做了验证消息显示所需的所有事情,但它没有,客户端验证也没有。在母版页的头部区域,我还包括了以下脚本 是什么导致了这个问题?解决办法是什么?