Axios: Como ignorar problemas de SSL

Criado em 13 nov. 2016  ·  35Comentários  ·  Fonte: axios/axios

É possível configurar o Axios (rodando em node.js) para ignorar erros SSL específicos (como certificados expirados)? Gostaria de saber se o certificado SSL tem um problema, mas quero que a transação seja concluída mesmo assim (por padrão, ela falha).

Comentários muito úteis

Você pode configurar axios para usar um agente personalizado e definir rejectUnauthorized para false para esse agente:

// At instance level
const instance = axios.create({
  httpsAgent: new https.Agent({  
    rejectUnauthorized: false
  })
});
instance.get('https://something.com/foo');

// At request level
const agent = new https.Agent({  
  rejectUnauthorized: false
});
axios.get('https://something.com/foo', { httpsAgent: agent });

Espero que isto ajude!

Todos 35 comentários

Você pode configurar axios para usar um agente personalizado e definir rejectUnauthorized para false para esse agente:

// At instance level
const instance = axios.create({
  httpsAgent: new https.Agent({  
    rejectUnauthorized: false
  })
});
instance.get('https://something.com/foo');

// At request level
const agent = new https.Agent({  
  rejectUnauthorized: false
});
axios.get('https://something.com/foo', { httpsAgent: agent });

Espero que isto ajude!

@nickuraltsev
não está funcionando com as mudanças acima
const https = requer ('https');
axios ({
url: url,
método: 'GET',
cabeçalhos: {
'Content-Type': 'application / json'
},
responseType: 'json',
httpsAgent: novo https.Agent ({rejeitarUnauthorized: falso})
})
.então (resposta => {
})
.catch (erro => {
})
}
}

Na verdade, acho que funciona, mas trata especificamente de certificados autoassinados. Não permite certificados expirados ou inválidos. Para permitir _qualquer_ certificado, você deve adicionar esta linha perto do topo do seu código;

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

Isso permitirá praticamente qualquer coisa, mas também é perigoso, portanto, use com cuidado.

@ Eric24
Não está funcionando se eu adicionar o código acima na primeira linha do meu arquivo.
Por favor, deixe-me saber o caminho exato para adicionar.

Para mim (necessidade de ignorar um certificado expirado, mas de outra forma válido), funcionou simplesmente adicionando esta linha logo após "use strict"; na parte superior do arquivo node.js principal, antes de qualquer outro código. É uma configuração tudo ou nada, mas seu objetivo é permitir que uma transação HTTPS seja concluída quando o agente, de outra forma, encerraria a transação devido a um problema de certificado. Talvez o seu cenário particular não esteja relacionado ao certificado?

se não for no nó, como obter o módulo https ????

Módulo https NÃO funciona com reagente nativo

+1

@psahni Você sabe como ignorar o problema de SSL no React Native?

@Germinate - Ainda estou lutando com o mesmo problema. Temos que mudar o código nativo do Android. E temos que construir reagir nativo da fonte. Não sei como fazer ainda.
Uma solução é criar um servidor proxy no nó entre o servidor reage nativo e principal. E roteie a solicitação de reagente nativo para o proxy do nó para o servidor principal.

@psahni Você já tentou essa solução ?

@Germinate - Parece ótimo !. Obrigado por compartilhar isso. Então, depois de fazer essas alterações. Podemos usar o módulo reac-nativo diretamente?

Ainda não funciona com o react nativo: /

Funciona no navegador? Estou usando axios com um aplicativo vue js e estou recebendo este erro net :: ERR_CERT_AUTHORITY_INVALID com um certificado autoassinado. A solução proposta assume que posso usar https.Agent, mas não sei como posso usar o módulo https no vue. Existe outra maneira? obrigado

temos https dentro do react-native? se sim, como o incluímos?

se você estiver usando nuxt / axios, você pode conseguir o acima, criando um plug-in com o seguinte código:
Aqui está o método documentado para criar o plugin em nuxt: https://axios.nuxtjs.org/extend.html

Esse padrão de desenvolvimento pode ser útil se você estiver desenvolvendo uma API localmente com um certificado autoassinado.

import https from 'https';

export default function ({ $axios, store }) {
    const agent = new https.Agent({  
        rejectUnauthorized: false
      });    
    $axios.onRequest(config => {
        if (process.env.dev) {
            config.httpsAgent = agent;
        }                     
    });
}

o que é um exemplo "post" disso?

Atualmente tentando fazer uma solicitação de postagem e ignorar SSL.

se você estiver usando nuxt / axios, você pode conseguir o acima, criando um plug-in com o seguinte código:
Aqui está o método documentado para criar o plugin em nuxt: https://axios.nuxtjs.org/extend.html

Esse padrão de desenvolvimento pode ser útil se você estiver desenvolvendo uma API localmente com um certificado autoassinado.

import https from 'https';

export default function ({ $axios, store }) {
    const agent = new https.Agent({  
        rejectUnauthorized: false
      });    
    $axios.onRequest(config => {
        if (process.env.dev) {
            config.httpsAgent = agent;
        }                     
    });
}

Devo chamar minhas solicitações asyncData ou axios existentes de forma diferente após criar axios.js na pasta de módulos?

Olhe para isso, resolveu para mim: https://stackoverflow.com/a/54475750/8577483

Ainda enfrentando esse problema. Usando https-browserify para obter o módulo https do nó no navegador.

const instance = axios.create({
    httpsAgent: new https.Agent({  
        rejectUnauthorized: false
    })
});

instance.post("https://...");

retorna ERR_CERT_AUTHORITY_INVALID

Também recebo o erro, usando o aplicativo criado com react-create-app

const axios = require('axios');
const https = require('https');

const result = await axios('https://localhost:8080/search/' + text, {
    headers: {"lang": lang},
    httpsAgent: new https.Agent({
        rejectUnauthorized: false
    })
});

Também tentei adicionar process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; no início do arquivo (abaixo de const https = require('https'); ) sem nenhum efeito.

Por que isso foi fechado? Parece que não há uma solução de trabalho.

Encontrei este tópico devido a um erro de 'falha de handshake de ssl' em meus logs e considerei tentar desligar as verificações conforme descrito por outras pessoas acima. Depois de muita solução de problemas (originalmente, pensei que era relacionado ao CORS), acabou sendo porque meu certificado SSL não tinha o certificado CA incluído. Se você suspeita que pode ser isso, use um dos SSL gratuitos verificar serviços como https://www.ssllabs.com/ssltest/ ou https://www.digicert.com/help/ para confirmar se seu certificado está bom. Espero que isso possa ajudar alguém.

Eu estava de repente lutando com esse problema também (apesar de não ter mudado nada). O que consertou para mim foi simplesmente executar uma solicitação GET padrão por meio de uma nova guia. Com isso quero dizer se você tem uma rota "/ users", tente abrir uma nova guia com {serverPath} / users. Isso me ajudou, embora eu não saiba por quê.

Você também pode simplesmente adicionar a variável de ambiente ao iniciar seu ambiente de desenvolvimento:

export NODE_TLS_REJECT_UNAUTHORIZED = 0 && yarn dev --env.NODE_TLS_REJECT_UNAUTHORIZED = 0

E talvez adicioná-lo ao seu arquivo package.json

"scripts": {
  "dev": "export NODE_TLS_REJECT_UNAUTHORIZED=0 && nuxt --env.NODE_TLS_REJECT_UNAUTHORIZED=0",

Eu estou enfrentando o mesmo problema. Estou usando axios e usando o método POST. Tentei todas as soluções mencionadas acima, mas sem sorte. Alguém encontrou as soluções de trabalho? Obrigada.

Não consegui fazer funcionar em uma única instância.

// doesn't work
axios.create({
    httpsAgent: new https.Agent({ rejectUnauthorized: false })
});

// it works
https.globalAgent.options.rejectUnauthorized = false;

Usando o nó;
Este é o erro SSL: unable to get local issuer certificate (20) (de uma solicitação curl)

Existe alguma atualização para o React Native?

Estou tendo o mesmo problema que @Falci - só funciona ao definir o sinalizador globalmente. Meu problema é um pouco diferente, Error: self signed certificate in certificate chain

Eu estou enfrentando o mesmo problema. Estou usando axios e usando o método POST. Tentei todas as soluções mencionadas acima, mas sem sorte. Alguém encontrou as soluções de trabalho? Obrigada.

import axios from "axios";
const https = require('https');

const resp = await axios({
      url,
      method: "POST",
      auth,
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    });

Funcionou para mim.

Fiquei preso aqui para o ambiente React Native. Qualquer solução para o aplicativo React Native, por favor?

Oi @fozhao

Se você está tentando usar certificados inválidos, pode tentar seguir esta abordagem:

  1. Instale o certificado no seu macbook
  2. Forçar confiança no certificado e exportá-lo
  3. iOS - Instale o certificado de exportação nos dispositivos e problema resolvido.
    Android - instale o certificado exportado no dispositivo e adicione o seguinte ao seu arquivo network_security_config.xml.
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system"/>
            <certificates src="user"/>
        </trust-anchors>
    </base-config>
     ....
</network-security-config>

Esta solução funcionou para o meu.
Obrigado!

@Fonger, por favor, elabore mais com sucessos e exemplos.

Módulo https é para nó, não funciona em Vue / React / ... Basicamente resulta no mesmo que process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
Se você deseja ignorar o SSL porque está usando SSR e, de qualquer forma, está pré-buscando dados no servidor local, isso não resultará em problemas de segurança.

Certifique-se de definir essa variável env no servidor, porém, cometi o erro ao tentar defini-la no cliente e o servidor ainda travou.

@tamangsuresh por que eu?

Esta página foi útil?
0 / 5 - 0 avaliações