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);
});
});
node.js
ssl-certificate
jira
Labeo
fuente
fuente
Respuestas:
Intente agregar el certificado raíz apropiado
Esta siempre será una opción mucho más segura que simplemente aceptar ciegamente puntos finales no autorizados, que a su vez solo deberían usarse como último recurso.
Esto puede ser tan simple como agregar
a su aplicación
El paquete npm de las CA raíz de SSL (como se usa aquí) es un paquete muy útil con respecto a este problema.
fuente
$(mkcert -CAROOT)/rootCA.pem
en un nuevo archivo de certificado y hacer algo comohttps.globalAgent.options.ca = fs.readFileSync('fullchain.pem')
Ver github.com/FiloSottile/mkcert/issues/76ssl-root-cas
aquellos con mentalidad de seguridad, el módulo npm tiene una solicitud para gz.coolaj86.com/coolaj86/ssl-root-cas.js/src/branch/master/… . Probablemente sea seguro porque es Mozilla, pero parece un vector de ataque.Otro truco sucio, que hará que todas tus solicitudes sean inseguras:
fuente
para no poder verificar el primer certificado en nodejs se necesita rechazar sin autorización
fuente
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:
Y esto:
fuente
cat domainname.crt domainname.ca-bundle > domainname-ssl-bundle.crt
unable to verify the first certificate
La cadena de certificados está incompleta.
Significa que el servidor web al que se está conectando está mal configurado y no incluyó el certificado intermedio en la cadena de certificados que le envió.
Cadena de certificados
Lo más probable es que se vea de la siguiente manera:
El certificado intermedio debe instalarse en el servidor, junto con el certificado del servidor.
Los certificados raíz están integrados en las aplicaciones de software, navegadores y sistemas operativos.
La aplicación que sirve el certificado tiene que enviar la cadena completa, esto significa el certificado del servidor en sí y todos los intermedios. Se supone que el cliente debe conocer el certificado raíz.
Recrear el problema
Vaya a https://incomplete-chain.badssl.com usando su navegador.
No muestra ningún error (el candado en la barra de direcciones es verde).
Es porque los navegadores tienden a completar la cadena si no se envía desde el servidor.
Ahora, conéctese a https://incomplete-chain.badssl.com usando Node:
Registros: " Error: no se puede verificar el primer certificado ".
Solución
Debe completar la cadena de certificados usted mismo.
Para hacer eso:
1: Necesita obtener el certificado intermedio que falta en
.pem
formato, luego2a: extienda el almacén de certificados incorporado de Node usando
NODE_EXTRA_CA_CERTS
,2b: o pase su propio paquete de certificados (intermedios y raíz) usando la
ca
opción1. ¿Cómo obtengo el certificado intermedio?
Usando
openssl
(viene con Git para Windows ).Guarde los detalles del certificado del servidor remoto:
Estamos buscando el emisor (el certificado intermedio es el emisor / firmante del certificado del servidor):
Debería proporcionarle el URI del certificado de firma. Descargalo:
Finalmente, conviértalo a
.pem
:2a. NODE_EXTRA_CERTS
Estoy usando cross-env para establecer variables de entorno en el
package.json
archivo:2b.
ca
opciónEsta opción sobrescribirá las CA raíz integradas del nodo.
Es por eso que necesitamos crear nuestra propia CA raíz. Use ssl-root-cas .
Luego, cree un
https
agente personalizado configurado con nuestro paquete de certificados (raíz e intermedio). Pase este agente aaxios
cuando haga una solicitud.En lugar de crear un
https
agente personalizado y pasárseloaxios
, puede colocar los certificados en elhttps
agente global:Recursos:
fuente
Esto realmente lo resolvió para mí, desde https://www.npmjs.com/package/ssl-root-cas
fuente
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.
fuente
GoDaddy SSL CCertificate
He experimentado esto al intentar conectarme a nuestro servidor API back-end con el certificado GoDaddy y aquí está el código que usé para resolver el problema.
PD:
Use el certificado incluido y no olvide instalar la biblioteca
npm install ssl-root-cas
fuente
Esto funcionó para mí => agregar agente y 'rechazar no autorizado' establecido en falso
fuente
Otro enfoque para resolver esto es usar el siguiente módulo.
node_extra_ca_certs_mozilla_bundle
Este módulo puede funcionar sin ninguna modificación de código al generar un archivo PEM que incluye todos los certificados raíz e intermedios confiables por Mozilla. Puede usar la siguiente variable de entorno (Funciona con Nodejs v7.3 +),
NODE_EXTRA_CA_CERTS
Para generar el archivo PEM para usar con la variable de entorno anterior. Puede instalar el módulo usando:
y luego inicie su script de nodo con una variable de entorno.
Otras formas de usar el archivo PEM generado están disponibles en:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
NOTA: Soy el autor del módulo anterior.
fuente
Estaba usando el módulo nodemailer npm. El siguiente código resolvió el problema
fuente