Ошибка: невозможно проверить первый сертификат в nodejs
Я пытаюсь загрузить файл с сервера jira с помощью URL-адреса, но я получаю сообщение об ошибке.
как включить сертификат в код для проверки
Ошибка:
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);
});
});
Ответы
Ответ 1
Попробуйте добавить соответствующий корневой сертификат
Это всегда будет намного более безопасным вариантом, чем слепое принятие несанкционированных конечных точек, которые, в свою очередь, должны использоваться только в качестве крайней меры.
Это может быть так просто, как добавление
require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();
к вашему заявлению.
Пакет SSL корневых центров сертификации (как используется здесь) является очень полезным пакетом для решения этой проблемы.
Ответ 2
для неспособности проверить первый сертификат в nodejs отказ от несанкционированного доступа
request({method: "GET",
"rejectUnauthorized": false,
"url": url,
"headers" : {"Content-Type": "application/json",
function(err,data,body) {
}).pipe(
fs.createWriteStream('file.html'));
Ответ 3
Еще один грязный хак, который сделает все ваши запросы небезопасными:
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0
Ответ 4
Сервер, который вы пытаетесь загрузить, может быть плохо настроен. Даже если он работает в вашем браузере, он может не включать все общедоступные сертификаты в цепочке, необходимые для проверки клиента с кешем-кешем.
Я рекомендую проверить сайт в инструменте SSLlabs: https://www.ssllabs.com/ssltest/
Посмотрите на эту ошибку:
Эта цепочка сертификатов сервера не завершена.
И это:
Проблемы с цепочкой......... Неполные
Ответ 5
Возможно, вы сможете это сделать, изменив параметры запроса, как показано ниже. Если вы используете самозаверяющий сертификат или отсутствующий посредник, установка strictSSL в false не приведет к принудительному пакету запроса для проверки сертификата.
var options = {
host: 'jira.example.com',
path: '/secure/attachment/206906/update.xlsx',
strictSSL: false
}
Ответ 6
Сертификат SSL для GoDaddy
Я испытал это, пытаясь подключиться к нашему серверу API backend с сертификатом GoDaddy, и вот код, который я использовал для решения проблемы.
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
Ответ 7
Это фактически решило это для меня, из 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
});
Ответ 8
Это сработало для меня => добавление агента и '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;
});
};
Ответ 9
Я использовал модуль nmamailer npm. Приведенный ниже код решил проблему
tls: {
// do not fail on invalid certs
rejectUnauthorized: false
}