Estou tentando baixar um arquivo do servidor jira usando um URL, mas estou recebendo um erro. como incluir o certificado no código para verificar o erro:
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)
Meu 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
fonte
fonte
Respostas:
Tente adicionar o certificado raiz apropriado
Essa sempre será uma opção muito mais segura do que aceitar cegamente pontos finais não autorizados, os quais, por sua vez, devem ser usados apenas como último recurso.
Isso pode ser tão simples quanto adicionar
para o seu aplicativo.
O pacote npm de CAs raiz SSL (conforme usado aqui) é um pacote muito útil sobre esse problema.
fonte
$(mkcert -CAROOT)/rootCA.pem
um novo arquivo de certificado e fazer algo comohttps.globalAgent.options.ca = fs.readFileSync('fullchain.pem')
See github.com/FiloSottile/mkcert/issues/76ssl-root-cas
módulo npm possui uma solicitação para o mozilla.org codificado em git.coolaj86.com/coolaj86/ssl-root-cas.js/src/branch/master/… . Provavelmente é seguro porque o Mozilla, mas parece um vetor de ataque.Outro truque sujo, que tornará todos os seus pedidos inseguros:
fonte
para incapaz de verificar o primeiro certificado em nodejs rejeitar não autorizado é necessário
fonte
O servidor do qual você está tentando baixar pode estar mal configurado. Mesmo que funcione no seu navegador, talvez não esteja incluindo todos os certificados públicos na cadeia necessários para a verificação de um cliente vazio em cache.
Eu recomendo verificar o site na ferramenta SSLlabs: https://www.ssllabs.com/ssltest/
Procure este erro:
E isto:
fonte
cat domainname.crt domainname.ca-bundle > domainname-ssl-bundle.crt
unable to verify the first certificate
A cadeia de certificados está incompleta.
Isso significa que o servidor da web ao qual você está se conectando está configurado incorretamente e não incluiu o certificado intermediário na cadeia de certificados que ele enviou a você.
Cadeia de certificados
Provavelmente tem a seguinte aparência:
O certificado intermediário deve ser instalado no servidor, junto com o certificado do servidor.
Os certificados raiz são incorporados aos aplicativos de software, navegadores e sistemas operacionais.
O aplicativo que atende o certificado deve enviar a cadeia completa, isso significa o próprio certificado do servidor e todos os intermediários. O certificado raiz deve ser conhecido pelo cliente.
Recrie o problema
Acesse https://incomplete-chain.badssl.com usando seu navegador.
Não mostra nenhum erro (o cadeado na barra de endereço é verde).
Isso ocorre porque os navegadores tendem a completar a cadeia se não forem enviados do servidor.
Agora, conecte-se a https://incomplete-chain.badssl.com usando o Node:
Logs: " Erro: não é possível verificar o primeiro certificado ".
Solução
Você precisa completar a cadeia de certificados.
Fazer isso:
1: você precisa obter o certificado intermediário ausente no
.pem
formato e, em seguida,2a: estenda o armazenamento de certificados interno do Node usando
NODE_EXTRA_CA_CERTS
,2b: ou passe seu próprio pacote de certificados (intermediários e raiz) usando
ca
opção1. Como obtenho certificado intermediário?
Usando
openssl
(vem com Git para Windows ).Salve os detalhes do certificado do servidor remoto:
Estamos procurando o emissor (o certificado intermediário é o emissor / assinante do certificado do servidor):
Ele deve fornecer o URI do certificado de assinatura. Baixe:
Por fim, converta-o para
.pem
:2a NODE_EXTRA_CERTS
Estou usando o ambiente cruzado para definir variáveis de ambiente no
package.json
arquivo:2b.
ca
opçãoEssa opção substituirá as CAs raiz internas do Nó.
É por isso que precisamos criar nossa própria CA raiz. Use ssl-root-cas .
Em seguida, crie um
https
agente personalizado configurado com nosso pacote de certificados (raiz e intermediário). Passe este agente paraaxios
ao fazer uma solicitação.Em vez de criar um
https
agente personalizado e passá-lo paraaxios
, você pode colocar os certificados nohttps
agente global:Recursos:
fonte
Isso realmente resolveu para mim, em https://www.npmjs.com/package/ssl-root-cas
fonte
Você pode fazer isso modificando as opções de solicitação conforme abaixo. Se você estiver usando um certificado autoassinado ou um intermediário ausente, configurar strictSSL como false não forçará o pacote de solicitação para validar o certificado.
fonte
Certificado SSL do GoDaddy
Eu experimentei isso ao tentar conectar ao nosso servidor de API back-end com certificado GoDaddy e aqui está o código que eu usei para resolver o problema.
PS:
Use o certificado incluído e não esqueça de instalar a biblioteca
npm install ssl-root-cas
fonte
Isso funcionou para mim => adicionando agente e 'rejectUnauthorized' definido como false
fonte
Outra abordagem para resolver isso é usar o seguinte módulo.
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
Eu estava usando o módulo nodemailer npm. O código abaixo resolveu o problema
fonte