J'utilise node.js request.js pour accéder à une API. J'obtiens cette erreur
[Erreur: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Toutes mes informations d'identification sont exactes et valides, et le serveur va bien. J'ai fait la même demande avec le facteur.
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);
});
Ce code est juste en cours d'exécution dans un script exécutable ex. node ./run_file.js
, Ç'est pourquoi? Doit-il fonctionner sur un serveur?
javascript
node.js
ssl
request
ThomasReggi
la source
la source
Réponses:
Remarque : ce qui suit est dangereux et permettra au contenu de l'API d'être intercepté et modifié entre le client et le serveur.
Cela a également fonctionné
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
la source
nodemailer
etnodemailer-smtp-transport
et la même commande générale a fonctionné. Vous devez ajouter ceci à votrecreateTransport
objet:tls:{rejectUnauthorized: false}
Ce n'est pas un problème avec l'application, mais avec le certificat qui est signé par une autorité de certification intermédiaire. Si vous acceptez ce fait et que vous souhaitez continuer, ajoutez ce qui suit aux options de demande:
Demande complète:
la source
La solution sécurisée
Plutôt que de désactiver la sécurité, vous pouvez ajouter les certificats nécessaires à la chaîne. Installez d'abord le package ssl-root-cas à partir de npm:
Ce package contient de nombreux certificats intermédiaires auxquels les navigateurs font confiance, mais pas le nœud.
Ajoutera les certificats manquants. Voir ici pour plus d'informations:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Voir également la réponse suivante ci-dessous
la source
ca
tableau. Je ne sais pas si son module http se penchera également sur la chaîne OS. Cependant, curl sur OS X semble n'utiliser que la chaîne du système d'exploitation et ne pas autoriser les certificats spécifiés manuellement.La solution de CoolAJ86 est correcte et ne compromet pas votre sécurité comme la désactivation de toutes les vérifications en utilisant
rejectUnauthorized
ouNODE_TLS_REJECT_UNAUTHORIZED
. Néanmoins, vous devrez peut-être injecter explicitement le certificat d'une autorité de certification supplémentaire.J'ai d'abord essayé les CA racine inclus par le module ssl-root-cas :
J'ai toujours fini avec l'
UNABLE_TO_VERIFY_LEAF_SIGNATURE
erreur. Ensuite, j'ai découvert qui a émis le certificat pour le site Web auquel je me connectais par l' analyseur SSL COMODO, j'ai téléchargé le certificat de cette autorité et j'ai essayé de n'ajouter que celui-là:Je me suis retrouvé avec une autre erreur:
CERT_UNTRUSTED
. Enfin, j'ai injecté les autorités de certification racine supplémentaires et inclus "mon" (apparemment intermédiaire) CA, qui a fonctionné:la source
.cer
exécution ceciopenssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
pour le convertir.crt
au préalablePour Create React App (où cette erreur se produit également et cette question est le résultat n ° 1 de Google), vous utilisez probablement
HTTPS=true npm start
et unproxy
(danspackage.json
) qui va à une API HTTPS qui est elle-même auto-signée, lorsqu'elle est en développement.Si tel est le cas, envisagez de changer
proxy
comme ceci:secure
décide si le proxy WebPack vérifie la chaîne de certificats ou non et la désactivation qui garantit que le certificat auto-signé de l'API n'est pas vérifié afin que vous obteniez vos données.la source
Il peut être très tentant de faire
rejectUnauthorized: false
ouprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
ne pas le faire! Cela vous expose à l'homme au milieu des attaques.Les autres réponses sont correctes dans la mesure où le problème réside dans le fait que votre certificat est «signé par une autorité de certification intermédiaire». Il existe une solution simple à cela, qui ne nécessite pas de bibliothèque tierce comme
ssl-root-cas
ou d'injection de CA supplémentaires dans le nœud.La plupart des clients https dans le nœud prennent en charge les options qui vous permettent de spécifier une autorité de certification par requête, ce qui résoudra
UNABLE_TO_VERIFY_LEAF_SIGNATURE
. Voici un exemple simple utilisant lehttps
module intégré de node .Si, cependant, vous pouvez configurer les paramètres ssl dans votre serveur d'hébergement, la meilleure solution serait d'ajouter les certificats intermédiaires à votre fournisseur d'hébergement. De cette façon, le demandeur client n'a pas besoin de spécifier une autorité de certification, car elle est incluse dans le serveur lui-même. J'utilise personnellement namecheap + heroku. L'astuce pour moi était de créer un fichier .crt avec
cat yourcertificate.crt bundle.ca-bundle > server.crt
. J'ai ensuite ouvert ce fichier et ajouté une nouvelle ligne après le premier certificat. Vous pouvez en savoir plus surhttps://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl
la source
Mettre cela ici au cas où cela aiderait quelqu'un, mon cas était différent et un peu étrange. J'obtenais cela sur une demande accessible via superagent - le problème n'avait rien à voir avec les certificats (qui étaient correctement configurés) et tout à voir avec le fait que je passais ensuite le résultat du superagent via le rappel en cascade du module async . Pour corriger: au lieu de transmettre le résultat entier, passez simplement
result.body
par le rappel de la cascade.la source
J'ai eu les mêmes problèmes. J'ai suivi la solution @ThomasReggi et @ CoolAJ86 et j'ai bien travaillé mais je ne suis pas satisfait de la solution.
Parce que le problème "UNABLE_TO_VERIFY_LEAF_SIGNATURE" est survenu en raison du niveau de configuration de la certification.
J'accepte la solution @thirdender mais sa solution partielle.Comme le site officiel de nginx , le certificat clairement mentionné doit être une combinaison du certificat de serveur et des certificats chaînés.
la source
Vous pouvez également essayer en définissant strictSSL sur
false
, comme ceci:la source
J'ai eu un problème avec ma configuration Apache après l'installation d'un certificat GoDaddy sur un sous-domaine. Au départ, je pensais que cela pourrait être un problème avec Node n'envoyant pas d'indicateur de nom de serveur (SNI), mais ce n'était pas le cas. L'analyse du certificat SSL du sous-domaine avec https://www.ssllabs.com/ssltest/ a renvoyé l'erreur Problèmes de chaîne: incomplets .
Après avoir ajouté le
gd_bundle-g2-g1.crt
fichier fourni par GoDaddy via laSSLCertificateChainFile
directive Apache, Node a pu se connecter via HTTPS et l'erreur a disparu.la source
Vous devez inclure le certificat intermédiaire dans votre serveur. Cela résout l '[Erreur: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
la source
Une autre approche pour résoudre ce problème en toute sécurité consiste à utiliser le module suivant.
node_extra_ca_certs_mozilla_bundle
Ce module peut fonctionner sans aucune modification de code en générant un fichier PEM qui comprend tous les certificats racine et intermédiaires approuvés par Mozilla. Vous pouvez utiliser la variable d'environnement suivante (Fonctionne avec Nodejs v7.3 +),
NODE_EXTRA_CA_CERTS
Pour générer le fichier PEM à utiliser avec la variable d'environnement ci-dessus. Vous pouvez installer le module en utilisant:
puis lancez votre script de nœud avec une variable d'environnement.
D'autres façons d'utiliser le fichier PEM généré sont disponibles sur:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
REMARQUE: je suis l'auteur du module ci-dessus.
la source
Si vous arrivez à ce fil parce que vous utilisez le module node postgres / pg, il existe une meilleure solution que de définir
NODE_TLS_REJECT_UNAUTHORIZED
ourejectUnauthorized
, ce qui conduira à des connexions non sécurisées.Au lieu de cela, configurez l'option "ssl" pour qu'elle corresponde aux paramètres de tls.connect :
J'ai écrit un module d'aide à l' analyse de ces options de variables d'environnement comme
PGSSLROOTCERT
,PGSSLCERT
etPGSSLKEY
:https://github.com/programmarchy/pg-ssl
la source
Les commandes suivantes ont fonctionné pour moi:
Le problème est que vous essayez d'installer un module à partir d'un référentiel avec un certificat SSL [Secure Sockets Layer] incorrect ou non approuvé. Une fois que vous aurez nettoyé le cache, ce problème sera résolu. Vous devrez peut-être l'activer ultérieurement.
la source