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
nodemailer
ynodemailer-smtp-transport
funcionó el mismo comando general. Necesita agregar esto a sucreateTransport
objeto: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
ca
matriz. 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
rejectUnauthorized
oNODE_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_SIGNATURE
error. 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
.cer
ejecución estoopenssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
para convertirlo de.crt
antemanoPara 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 start
y unproxy
(inpackage.json
) que va a alguna API HTTPS que es autofirmado, cuando está en desarrollo.Si ese es el caso, considere cambiar
proxy
así:secure
decide 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: false
oprocess.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-cas
o 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 elhttps
mó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.body
por 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.crt
archivo proporcionado por GoDaddy a través de laSSLCertificateChainFile
directiva 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_UNAUTHORIZED
orejectUnauthorized
, 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
,PGSSLCERT
yPGSSLKEY
: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