我正在尝试使用url从jira服务器下载文件,但是我收到了一个错误。如何在代码中包含证书以进行验证错误:
错误:无法验证第一个证书 的NodeJS </跨度> 鈥
在错误(本机) 在TLSSocket。&lt; anonymous&gt; (_tls_wrap.js:929:36)
在TLSSocket.emit(events.js:104:17)
在TLSSocket._finishInit(_tls_wrap.js:460:8)
我的 的NodeJS </跨度> 码:
var https = require鈥
的 GoDaddy SSL CCertificate 强>
我尝试使用GoDaddy证书连接到我们的后端API服务器时遇到过这种情况,这里是我用来解决问题的代码。
var rootCas = require('ssl-root-cas/latest').create(); rootCas .addFile(path.join(__dirname, '../config/ssl/gd_bundle-g2-g1.crt')) ; // will work with all https requests will all libraries (i.e. request.js) require('https').globalAgent.options.ca = rootCas;
的 PS: 强>
使用捆绑的证书,不要忘记安装库 npm install ssl-root-cas
npm install ssl-root-cas
您可以通过修改请求选项来执行此操作,如下所示。如果您使用自签名证书或缺少中介,则将strictSSL设置为false将不会强制请求程序包验证证书。
var options = { host: 'jira.example.com', path: '/secure/attachment/206906/update.xlsx', strictSSL: false }
如果无法验证nodejs中的第一个证书,则需要拒绝未授权
request({method: "GET", "rejectUnauthorized": false, "url": url, "headers" : {"Content-Type": "application/json", function(err,data,body) { }).pipe( fs.createWriteStream('file.html'));
另一个肮脏的黑客,这将使你的所有请求不安全:
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
您尝试从中下载的服务器可能配置不当。即使它在您的浏览器中有效,它也可能不包括缓存空客户端验证所需的链中的所有公共证书。
我建议在SSLlabs工具中检查网站: https://www.ssllabs.com/ssltest/
寻找这个错误:
此服务器的证书链不完整。
还有这个:
连锁问题.........不完整
这总是比盲目接受未经授权的终点更安全的选择,而这些终点反过来只能作为最后的手段使用。
这可以像添加一样简单
require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();
到您的申请。
该 SSL Root CAs npm包 (这里使用的)是关于这个问题的一个非常有用的包。
我使用的是nodemailer npm模块。以下代码解决了这个问题
tls: { // do not fail on invalid certs rejectUnauthorized: false }
这实际上是为我解决了这个问题 https://www.npmjs.com/package/ssl-root-cas
// INCORRECT (but might still work) var server https.createServer({ key: fs.readFileSync('privkey.pem', 'ascii') , cert: fs.readFileSync('cert.pem', 'ascii') // a PEM containing ONLY the SERVER certificate }); // CORRECT (should always work) var server https.createServer({ key: fs.readFileSync('privkey.pem', 'ascii') , cert: fs.readFileSync('fullchain.pem', 'ascii') // a PEM containing the SERVER and ALL INTERMEDIATES });