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);
});
});
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.
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'));
Un autre hack qui rendra toutes vos requêtes peu sûres:
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
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
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
}
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;
});
};
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
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
});
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
}