Estou usando o node.js request.js para acessar uma API. Estou recebendo este erro
[Erro: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Todas as minhas credenciais são precisas e válidas, e o servidor está bem. Fiz o mesmo pedido com o carteiro.
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 está sendo executado apenas em um script executável ex. node ./run_file.js
, É por isso que? Ele precisa ser executado em um servidor?
javascript
node.js
ssl
request
ThomasReggi
fonte
fonte
Respostas:
Nota : o seguinte é perigoso e permitirá que o conteúdo da API seja interceptado e modificado entre o cliente e o servidor.
Isso também funcionou
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
fonte
nodemailer
enodemailer-smtp-transport
e o mesmo comando geral funcionou. Você precisa adicionar isso ao seucreateTransport
objeto:tls:{rejectUnauthorized: false}
Não é um problema com o aplicativo, mas com o certificado assinado por uma CA intermediária. Se você aceitar esse fato e ainda quiser continuar, adicione o seguinte para solicitar opções:
Pedido completo:
fonte
A solução segura
Em vez de desativar a segurança, você pode adicionar os certificados necessários à cadeia. Primeiro instale o pacote ssl-root-cas a partir do npm:
Este pacote contém muitos certificados intermediários nos quais os navegadores confiam, mas o nó não.
Irá adicionar os certificados ausentes. Veja aqui para mais informações:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Veja também a próxima resposta abaixo
fonte
ca
matriz. Não sei se o módulo http também procurará a cadeia do sistema operacional. No entanto, a ondulação no OS X parece usar apenas a cadeia do SO e não permitir certificados manualmente especificados.A solução do CoolAJ86 está correta e não compromete sua segurança, como desativar todas as verificações usando
rejectUnauthorized
ouNODE_TLS_REJECT_UNAUTHORIZED
. Ainda assim, pode ser necessário injetar explicitamente um certificado de autoridade de certificação adicional.Tentei primeiro as autoridades de certificação raiz incluídas no módulo ssl-root-cas :
Eu ainda acabei com o
UNABLE_TO_VERIFY_LEAF_SIGNATURE
erro. Em seguida, descobri quem emitiu o certificado para o site ao qual estava me conectando pelo COMODO SSL Analyzer , baixei o certificado dessa autoridade e tentei adicionar apenas aquele:Acabei com outro erro:
CERT_UNTRUSTED
. Por fim, injetei as CAs raiz adicionais e incluí a CA "minha" (aparentemente intermediária), que funcionou:fonte
.cer
executar esteopenssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
para convertê-lo ta.crt
de antemãoPara o Create Create React App (onde esse erro também ocorre e esta pergunta é o principal resultado do Google), você provavelmente está usando
HTTPS=true npm start
umproxy
(inpackage.json
) que vai para alguma API HTTPS que é autoassinada quando está em desenvolvimento.Se for esse o caso, considere mudar
proxy
assim:secure
decide se o proxy WebPack verifica ou não a cadeia de certificados e desativa, o que garante que o certificado autoassinado da API não seja verificado para que você obtenha seus dados.fonte
Pode ser muito tentador fazer
rejectUnauthorized: false
ouprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
não fazê-lo! Expõe você ao homem nos ataques do meio.As outras respostas estão corretas, pois o problema está no fato de o seu certificado ser "assinado por uma CA intermediária". Existe uma solução fácil para isso, que não requer uma biblioteca de terceiros, como
ssl-root-cas
injeta CAs adicionais no nó.A maioria dos clientes https no nó suporta opções que permitem especificar uma CA por solicitação, que será resolvida
UNABLE_TO_VERIFY_LEAF_SIGNATURE
. Aqui está um exemplo simples usando ohttps
módulo interno do nó .Se, no entanto, você puder definir as configurações de SSL no servidor de hospedagem, a melhor solução seria adicionar os certificados intermediários ao seu provedor de hospedagem. Dessa forma, o solicitante do cliente não precisa especificar uma CA, pois está incluída no próprio servidor. Eu pessoalmente uso namecheap + heroku. O truque para mim foi criar um arquivo .crt com
cat yourcertificate.crt bundle.ca-bundle > server.crt
. Abri esse arquivo e adicionei uma nova linha após o primeiro certificado. Você pode ler mais emhttps://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl
fonte
Colocando isso aqui, caso isso ajude alguém, meu caso foi diferente e um pouco estranho. Eu estava recebendo isso em uma solicitação acessada via superagent - o problema não tinha nada a ver com certificados (que foram configurados corretamente) e tudo relacionado ao fato de eu estar passando o resultado do superagent pelo retorno de chamada em cascata do módulo assíncrono . Para corrigir: em vez de passar o resultado inteiro, basta passar
result.body
pelo retorno de chamada da cachoeira.fonte
Eu tive os mesmos problemas. Segui as soluções @ThomasReggi e @ CoolAJ86 e funcionou bem, mas não estou satisfeito com a solução.
Porque o problema "UNABLE_TO_VERIFY_LEAF_SIGNATURE" ocorreu devido ao nível de configuração da certificação.
Eu aceito a solução @thirdender, mas sua solução parcial. Conforme o site oficial da nginx , eles mencionaram claramente que o certificado deve ser a combinação de O certificado do servidor e os certificados encadeados.
fonte
Você também pode tentar configurando strictSSL para
false
, assim:fonte
Eu tive um problema com minha configuração do Apache depois de instalar um certificado do GoDaddy em um subdomínio. Originalmente, pensei que poderia haver um problema com o Node não enviar um SNI (Server Name Indicator), mas esse não foi o caso. A análise do certificado SSL do subdomínio com https://www.ssllabs.com/ssltest/ retornou o erro Problemas de cadeia: incompleto .
Depois de adicionar o
gd_bundle-g2-g1.crt
arquivo fornecido pelo GoDaddy por meio daSSLCertificateChainFile
diretiva Apache, o Node conseguiu se conectar por HTTPS e o erro desapareceu.fonte
Você precisa incluir o certificado intermediário no seu servidor. Isso resolve o [Erro: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
fonte
Outra abordagem para solucionar isso com segurança é usar o módulo a seguir.
node_extra_ca_certs_mozilla_bundle
Este módulo pode funcionar sem nenhuma modificação de código, gerando um arquivo PEM que inclui todos os certificados raiz e intermediários confiáveis pelo Mozilla. Você pode usar a seguinte variável de ambiente (Works with Nodejs v7.3 +),
NODE_EXTRA_CA_CERTS
Para gerar o arquivo PEM para usar com a variável de ambiente acima. Você pode instalar o módulo usando:
e, em seguida, inicie o script do nó com uma variável de ambiente.
Outras maneiras de usar o arquivo PEM gerado estão disponíveis em:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
NOTA: Eu sou o autor do módulo acima.
fonte
Se você chegar a esse encadeamento porque está usando o módulo postgres / pg do nó, há uma solução melhor que a configuração
NODE_TLS_REJECT_UNAUTHORIZED
ourejectUnauthorized
, que levará a conexões inseguras.Em vez disso, configure a opção "ssl" para corresponder aos parâmetros para tls.connect :
Eu escrevi um módulo para ajudar com a análise dessas opções de variáveis de ambiente como
PGSSLROOTCERT
,PGSSLCERT
, ePGSSLKEY
:https://github.com/programmarchy/pg-ssl
fonte
Os seguintes comandos funcionaram para mim:
O problema é que você está tentando instalar um módulo a partir de um repositório com um certificado SSL [Secure Sockets Layer] inválido ou não confiável. Depois de limpar o cache, esse problema será resolvido. Talvez seja necessário transformá-lo em verdadeiro mais tarde.
fonte