web-dev-qa-db-fra.com

Erreur: impossible de vérifier le premier certificat dans nodejs

J'essaie de télécharger un fichier à partir du serveur Jira en utilisant une URL, mais je reçois une erreur . Comment inclure le certificat dans le code à vérifier Erreur:

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)

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

    });
});
75
Labeo

Essayez d'ajouter le certificat racine approprié

Cela constituera toujours une option beaucoup plus sûre que simplement accepter aveuglément des points de terminaison non autorisés, qui ne devraient être utilisés qu'en dernier recours.

Cela peut être aussi simple que d'ajouter

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

à votre application.

Le package npm SSL Rs CAs (tel qu'utilisé ici) est un package très utile concernant ce problème.

72
Joshua

pour impossible de vérifier le premier certificat dans nodejs rejeter non autorisé est nécessaire

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

Un autre hack qui rendra toutes vos requêtes peu sûres:

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

Le serveur à partir duquel vous essayez de télécharger est peut-être mal configuré. Même si cela fonctionne dans votre navigateur, il se peut qu'il n'inclue pas tous les certificats publics de la chaîne nécessaires à la vérification d'un client avec cache vide.

Je recommande de consulter le site dans l'outil SSLlabs: https://www.ssllabs.com/ssltest/

Cherchez cette erreur:

La chaîne de certificats de ce serveur est incomplète.

Et ça:

Problèmes liés à la chaîne ......... incomplet

16
Flimm

Pour ce faire, vous pourrez peut-être modifier les options de la requête comme indiqué ci-dessous. Si vous utilisez un certificat auto-signé ou un intermédiaire manquant, la définition de strictSSL sur false ne force pas le package de demande à valider le certificat.

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

Cela a fonctionné pour moi => ajout de l'agent et 'rejetezUnauthorized' défini sur 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;
    });
};
1

Certificat SSL GoDaddy

J'ai expérimenté cela en essayant de me connecter à notre serveur API backend avec un certificat GoDaddy et voici le code que j'ai utilisé pour résoudre le problème.

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:

Utilisez le certificat fourni et n'oubliez pas d'installer la bibliothèque npm install ssl-root-cas

1

Cela a résolu le problème pour moi, de 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
});
0
koolaang

J'utilisais le module nodemailer npm. Le code ci-dessous a résolu le problème

     tls: {
     // do not fail on invalid certs
     rejectUnauthorized: false
     }
0
Chandru