Estoy usando node.js request.js para llegar a una API. Me sale este error
[Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Todas mis credenciales son precisas y válidas, y el servidor está bien. Hice la misma solicitud con el cartero.
request({
"url": domain+"/api/orders/originator/"+id,
"method": "GET",
"headers":{
"X-API-VERSION": 1,
"X-API-KEY": key
},
}, function(err, response, body){
console.log(err);
console.log(response);
console.log(body);
});
Este código solo se ejecuta en un script ejecutable ej. node ./run_file.js, ¿Es esa la razón de? ¿Necesita ejecutarse en un servidor?
javascript
node.js
ssl
request
ThomasReggi
fuente
fuente

Respuestas:
Nota : lo siguiente es peligroso y permitirá que el contenido de la API sea interceptado y modificado entre el cliente y el servidor.
Esto también funcionó
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';fuente
nodemailerynodemailer-smtp-transportfuncionó el mismo comando general. Necesita agregar esto a sucreateTransportobjeto:tls:{rejectUnauthorized: false}No es un problema con la aplicación, sino con el certificado firmado por una CA intermediaria. Si acepta ese hecho y aún desea continuar, agregue lo siguiente para solicitar opciones:
Solicitud completa:
fuente
La solución segura
En lugar de desactivar la seguridad, puede agregar los certificados necesarios a la cadena. Primero instale el paquete ssl-root-cas desde npm:
Este paquete contiene muchos certificados intermedios en los que los navegadores confían pero el nodo no.
Agregará los certificados faltantes. Vea aqui para mas informacion:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Además, vea la siguiente respuesta a continuación
fuente
camatriz. No sé si su módulo http también mirará a la cadena del sistema operativo. Sin embargo, curl en OS X parece usar solo la cadena del sistema operativo y no permitir certificados especificados manualmente.La solución de CoolAJ86 es correcta y no compromete su seguridad, como deshabilitar todas las comprobaciones usando
rejectUnauthorizedoNODE_TLS_REJECT_UNAUTHORIZED. Aún así, es posible que deba inyectar un certificado de CA adicional explícitamente.Primero probé las CA raíz incluidas en el módulo ssl-root-cas :
Todavía terminé con el
UNABLE_TO_VERIFY_LEAF_SIGNATUREerror. Luego descubrí quién emitió el certificado para el sitio web al que me estaba conectando mediante el analizador COMODO SSL , descargué el certificado de esa autoridad e intenté agregar solo ese:Terminé con otro error:
CERT_UNTRUSTED. Finalmente, inyecté las CA raíz adicionales e incluí "mi" (aparentemente intermediario) CA, que funcionó:fuente
.cerejecución estoopenssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crtpara convertirlo de.crtantemanoPara la aplicación Create React (donde también se produce este error y esta pregunta es el resultado # 1 de Google), es probable que esté utilizando
HTTPS=true npm starty unproxy(inpackage.json) que va a alguna API HTTPS que es autofirmado, cuando está en desarrollo.Si ese es el caso, considere cambiar
proxyasí:securedecide si el proxy de WebPack verifica o no la cadena de certificados y la desactivación asegura que el certificado autofirmado de la API no se verifique para que pueda obtener sus datos.fuente
¡Puede ser muy tentador hacerlo
rejectUnauthorized: falseoprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';no hacerlo! Te expone al hombre en los ataques medios.Las otras respuestas son correctas porque el problema radica en el hecho de que su certificado está "firmado por una CA intermediaria". Hay una solución fácil para esto, una que no requiere una biblioteca de terceros como
ssl-root-caso inyectar ninguna CA adicional en el nodo.La mayoría de los clientes https en opciones de soporte de nodo que le permiten especificar una CA por solicitud, que se resolverá
UNABLE_TO_VERIFY_LEAF_SIGNATURE. Aquí hay un ejemplo simple que usa elhttpsmódulo incorporado del nodo .Sin embargo, si puede configurar los ajustes de SSL en su servidor de alojamiento, la mejor solución sería agregar los certificados intermedios a su proveedor de alojamiento. De esa forma, el solicitante del cliente no necesita especificar una CA, ya que está incluida en el servidor. Yo personalmente uso namecheap + heroku. El truco para mí fue crear un archivo .crt con
cat yourcertificate.crt bundle.ca-bundle > server.crt. Luego abrí este archivo y agregué una nueva línea después del primer certificado. Puedes leer más enhttps://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl
fuente
Solo poner esto aquí en caso de que ayude a alguien, mi caso fue diferente y un poco extraño. Recibí esto en una solicitud a la que se accedió a través de superagent : el problema no tenía nada que ver con los certificados (que se configuraron correctamente) y todo que ver con el hecho de que luego estaba pasando el resultado de superagent a través de la devolución de llamada en cascada del módulo asíncrono . Para solucionarlo: en lugar de pasar el resultado completo, simplemente pase
result.bodypor la devolución de llamada de la cascada.fuente
Tuve los mismos problemas. He seguido la solución @ThomasReggi y @ CoolAJ86 y he trabajado bien, pero no estoy satisfecho con la solución.
Debido a que se produjo el problema "UNABLE_TO_VERIFY_LEAF_SIGNATURE" debido al nivel de configuración de la certificación.
Acepto la solución @thirdender, pero es una solución parcial. Según el sitio web oficial de nginx , mencionaron claramente que el certificado debe ser una combinación de El certificado del servidor y los certificados encadenados.
fuente
También puede intentarlo poniendo estricto SSL a
false, de esta manera:fuente
Tuve un problema con mi configuración de Apache después de instalar un certificado GoDaddy en un subdominio. Originalmente pensé que podría ser un problema con Node no enviando un Indicador de nombre de servidor (SNI), pero ese no fue el caso. El análisis del certificado SSL del subdominio con https://www.ssllabs.com/ssltest/ devolvió el error Problemas de la cadena: Incompleto .
Después de agregar el
gd_bundle-g2-g1.crtarchivo proporcionado por GoDaddy a través de laSSLCertificateChainFiledirectiva Apache, Node pudo conectarse a través de HTTPS y el error desapareció.fuente
Debe incluir el certificado intermedio en su servidor. Esto resuelve el [Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
fuente
Otro enfoque para resolver esto de manera segura 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
Si llega a este hilo porque está usando el módulo postgres / pg de nodo, hay una mejor solución que establecer
NODE_TLS_REJECT_UNAUTHORIZEDorejectUnauthorized, lo que conducirá a conexiones inseguras.En su lugar, configure la opción "ssl" para que coincida con los parámetros de tls.connect :
He escrito un módulo de ayuda para analizar estas opciones de variables de entorno como
PGSSLROOTCERT,PGSSLCERTyPGSSLKEY:https://github.com/programmarchy/pg-ssl
fuente
Los siguientes comandos me funcionaron:
El problema es que está intentando instalar un módulo desde un repositorio con un certificado SSL [Capa de sockets seguros] incorrecto o no confiable. Una vez que limpie el caché, este problema se resolverá. Es posible que tenga que convertirlo en verdadero más adelante.
fuente