web-dev-qa-db-ja.com

エラー:nodejsの最初の証明書を検証できません

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

    });
});
89
Labeo

適切なルート証明書を追加してみてください

これは常に、無許可のエンドポイントを単に盲目的に受け入れることよりもはるかに安全な選択肢になるでしょう。

これは追加するのと同じくらい簡単です

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

あなたのアプリケーションに。

SSLルートCA npmパッケージ (ここで使用されている)は、この問題に関して非常に便利なパッケージです。

82
Joshua

nodejs内の最初の証明書が無許可であることを検証できないため、認証が必要です。

 request({method: "GET", 
        "rejectUnauthorized": false, 
        "url": url,
        "headers" : {"Content-Type": "application/json",
        function(err,data,body) {
    }).pipe(
       fs.createWriteStream('file.html'));
29
Labeo

もう一つの汚いハック、これはあなたの全てのリクエストを危険にさらすでしょう:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
25
Satara

ダウンロードしようとしているサーバーの設定が正しくない可能性があります。たとえそれがあなたのブラウザで動くとしても、それはキャッシュエンプティクライアントが検証するのに必要なチェーンの中にすべての公開証明書を含んでいるわけではないかもしれません。

SSLlabsツールでサイトをチェックすることをお勧めします。 https://www.ssllabs.com/ssltest/

このエラーを探します。

このサーバーの証明書チェーンは不完全です。

この:

チェーンの問題.........不完全

18
Flimm

以下のようにリクエストオプションを修正することでこれを行うことができるかもしれません。自己署名証明書または不足している仲介者を使用している場合、strictSSLをfalseに設定しても要求パッケージに証明書の検証を強制することはできません。

var options = {
   Host: 'jira.example.com',
   path: '/secure/attachment/206906/update.xlsx',
   strictSSL: false
}
5
Sundar

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

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
     }
0
Chandru