node.js - ejecutar - Error: no se puede verificar el primer certificado en nodejs
node js servidor https (9)
Estoy tratando de descargar un archivo del servidor jira usando una url pero recibo un error. Cómo incluir el certificado en el código para verificar el error:
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)
Mi código 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);
});
});
Esto funcionó para mí => agregar agente y ''rechazar no autorizado'' establecido en falso
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;
});
};
Intente agregar el certificado raíz apropiado
Esta siempre será una opción mucho más segura que aceptar ciegamente puntos finales no autorizados, que a su vez solo deben usarse como último recurso.
Esto puede ser tan simple como agregar
require(''https'').globalAgent.options.ca = require(''ssl-root-cas/latest'').create();
a su aplicación
El paquete npm SSL Root CAs (como se usa aquí) es un paquete muy útil con respecto a este problema.
El servidor desde el que intenta descargar puede estar mal configurado. Incluso si funciona en su navegador, es posible que no incluya todos los certificados públicos en la cadena necesarios para que un cliente con caché vacío verifique.
Recomiendo revisar el sitio en la herramienta SSLlabs: https://www.ssllabs.com/ssltest/
Busque este error:
La cadena de certificados de este servidor está incompleta.
Y esto:
Problemas de cadena ......... Incompleto
Estaba usando el módulo nodemailer npm. El siguiente código resolvió el problema
tls: {
// do not fail on invalid certs
rejectUnauthorized: false
}
Esto realmente lo resolvió para mí, desde 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
});
Otro truco sucio, que hará que todas tus solicitudes sean inseguras:
process.env[''NODE_TLS_REJECT_UNAUTHORIZED''] = 0
Puede hacerlo modificando las opciones de solicitud como se muestra a continuación. Si está utilizando un certificado autofirmado o un intermediario faltante, establecer estrictoSSL en falso no obligará al paquete de solicitud a validar el certificado.
var options = {
host: ''jira.example.com'',
path: ''/secure/attachment/206906/update.xlsx'',
strictSSL: false
}
para no poder verificar el primer certificado en nodejs se necesita rechazar sin autorización
request({method: "GET",
"rejectUnauthorized": false,
"url": url,
"headers" : {"Content-Type": "application/json",
function(err,data,body) {
}).pipe(
fs.createWriteStream(''file.html''));
GoDaddy SSL CCertificate
He experimentado esto al intentar conectarme a nuestro servidor API de back-end con el certificado GoDaddy y aquí está el código que utilicé para resolver el problema.
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;
PD:
Use el certificado incluido y no olvide instalar la biblioteca
npm install ssl-root-cas