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);
});
});
これは常に、無許可のエンドポイントを単に盲目的に受け入れることよりもはるかに安全な選択肢になるでしょう。
これは追加するのと同じくらい簡単です
require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();
あなたのアプリケーションに。
SSLルートCA npmパッケージ (ここで使用されている)は、この問題に関して非常に便利なパッケージです。
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/
このエラーを探します。
このサーバーの証明書チェーンは不完全です。
この:
チェーンの問題.........不完全
以下のようにリクエストオプションを修正することでこれを行うことができるかもしれません。自己署名証明書または不足している仲介者を使用している場合、strictSSLをfalseに設定しても要求パッケージに証明書の検証を強制することはできません。
var options = {
Host: 'jira.example.com',
path: '/secure/attachment/206906/update.xlsx',
strictSSL: 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
});
This Worked For me =>エージェントを追加し、 'rejectUnauthorized'をfalseに設定
const https = require('https'); //Add This
const bindingGridData = async () => {
const url = `your URL-Here`;
const request = new Request(url, {
method: 'GET',
headers: new Headers({
Authorization: `Your Token If Any`,
'Content-Type': 'application/json',
}),
//Add The Below
agent: new https.Agent({
rejectUnauthorized: false,
}),
});
return await fetch(request)
.then((response: any) => {
return response.json();
})
.then((response: any) => {
console.log('response is', response);
return response;
})
.catch((err: any) => {
console.log('This is Error', err);
return;
});
};
GoDaddy SSL証明書
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
をインストールすることを忘れないでください
私はnodemailerのnpmモジュールを使っていました。以下のコードは問題を解決しました
tls: {
// do not fail on invalid certs
rejectUnauthorized: false
}