Axios: Falha na solicitação de HTTPS com proxy HTTP

Criado em 30 mai. 2017  ·  52Comentários  ·  Fonte: axios/axios

Resumo

A tentativa de fazer uma solicitação HTTPS com um proxy HTTP falha.

const req = await axios({
  url: 'https://somedomain.com',
  proxy: {
    host: '89.151.146.7',
    port: 6060,
    auth: {
      username: 'myname',
      password: 'mypass',
    },
  },
});

Resulta em:

Error: write EPROTO 140736379442112:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794

O problema já foi descrito por @chovy neste ticket, que acabou sendo fechado porque o OP não teve o mesmo problema: https://github.com/mzabriskie/axios/issues/662

@chovy diz:

Ainda tenho esse problema de não conseguir acessar um url https com um proxy http. Eu posso fazer isso bem no pedido e também no curl do shell. Algo não funciona com axios. Recebo um erro EPROTO.

Contexto

  • versão axios: v0.16.1
  • Ambiente: nó v7.10.0, Mac OSX Sierra

Comentários muito úteis

Tive um problema semelhante recentemente, minha solução foi usar um túnel HTTPS sobre HTTP, especificar a porta 443 explicitamente no URL e desativar a detecção automática de proxy em axios:

import axios, { AxiosInstance } from 'axios';
import * as tunnel from 'tunnel';

const tunnel = tunnel.httpsOverHttp({
    proxy: {
        host: 'proxy.mycorp.com',
        port: 8000,
    },
});

const httpClient: AxiosInstance = axios.create({
    baseURL: 'https://some.api.com:443',
    httpsAgent: tunnel,
    proxy: false,
});

Mais sobre a solução neste artigo .

Espero que isto ajude,
Jan

Todos 52 comentários

Estou tendo o mesmo problema de solicitação de https sobre proxy. Não quero passar para request.js.

return axios({ url: 'https://site.com', proxy: { host: 'proxy.xxxxxx.com', port: 3128 } })
Resultado:
Error: write EPROTO 139800246822688:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:794

request.js e curl nesta situação funcionam bem.

Contexto

  • versão axios: v0.16.1
  • Ambiente: nó v6.9.5, CentOS versão 6.8 (final)

Eu e um colega meu identificamos o problema, um PR deve chegar em breve

O mesmo problema aqui: Solicitar recursos https atrás de um proxy http.

axios.get('https://resources.json', {   
   proxy: {
      host: 'http://my.proxy.com',
      port: 12345
   }
})
   .then(() => {})
   .catch(() => {});

Resultado:
Error: getaddrinfo ENOTFOUND http://my.proxy.com http://my.proxy.com:12345

Algum progresso nisso até agora?

Mesmo problema aqui.

Qualquer notícia ?

Meu problema não estava relacionado a proxies embora, eu tive que enviar uma solicitação GET para https domínio que não era certificado. Em curl dentro do terminal linux, a solução foi usar a bandeira -k ou --insecure . Não consegui encontrar a solução Axios embora, mas com request lib eu fiz assim; pode te dar uma ideia:

const agentOptions = {
    host: '10.100.0.10',
    port: '443',
    path: '/',
    rejectUnauthorized: false,
  }

const agent = new https.Agent(agentOptions)
request({
      url: 'https://10.100.0.10/myUncertifiedTargetUrl',
      method: 'GET',
      agent,
    }, (err, resp, body) => {
...

Sinta-se à vontade para usar isso até que eles tenham o # 959 mesclado.

O mesmo aqui, aliás , a RP de

@mistermoe Acabei de sair do trabalho sem fazer sucesso :(

Eu uso este pacote: https://github.com/Yoctol/messaging-apis/tree/master/packages/messaging-api-messenger

E se eu substituir "axios" pelo seu, o seguinte erro desaparece:
"Erro: escrever EPROTO 139800246822688: erro: 140770FC : Rotinas SSL protocolo desconhecido

Mas eu tenho algo como:
"Erro: getaddrinfo EAI_AGAIN"

Percebo que o plugin do Messenger faz solicitações como estas:
`
deixar cliente = axios.create ({...});

client.get ('...')
`

Você foi bem-sucedido desta forma ou não diretamente pela função de "solicitação" do Axios?

Obrigado!

EDIT: Outro com este problema:
https://github.com/axios/axios/pull/959#issuecomment -337595602

Alguma chance de mesclar isso? Podemos aproveitar o novo config.transport adicionado para evitar esse problema?

ups, mesmo problema aqui!

Infelizmente, essa solicitação de pull não foi mesclada, mas eu corrigi esse problema https://github.com/Sitronik/axios

Tive um problema semelhante recentemente, minha solução foi usar um túnel HTTPS sobre HTTP, especificar a porta 443 explicitamente no URL e desativar a detecção automática de proxy em axios:

import axios, { AxiosInstance } from 'axios';
import * as tunnel from 'tunnel';

const tunnel = tunnel.httpsOverHttp({
    proxy: {
        host: 'proxy.mycorp.com',
        port: 8000,
    },
});

const httpClient: AxiosInstance = axios.create({
    baseURL: 'https://some.api.com:443',
    httpsAgent: tunnel,
    proxy: false,
});

Mais sobre a solução neste artigo .

Espero que isto ajude,
Jan

@ jan-molak Minha correção é fácil de usar:

  1. npm install axios-https-proxy-fix
  2. Então
import axios from 'axios-https-proxy-fix'; 

const proxy = {
  host: 'some_ip',
  port: some_port_number,
  auth: {
    username: 'some_login',
    password: 'some_pass'
  }
};

async someMethod() {
  const result = await axios.get('some_https_link', {proxy});
}

A solução de @jan-molak também funcionou para mim. No entanto, seria realmente bom não ter que forçar o número da porta no url.

@ jan-molak @Sitronik Tentei sua solução, mas obteve Erro: o soquete
O que eu quero é ver como a solicitação passa por charles, então eu abro charles e defino o proxy para {host: '127.0.0.1', porta: 8888 } em meu código. Não sei se é adequado usar sua solução

Alguma chance de ser incluído no 0.19.0?

@astappev isso definitivamente parece que precisa de uma correção o mais rápido possível. Há muitos problemas relacionados e PRs que preciso analisar, mas vou adicioná-los ao meu roteiro 0.19.0.

@emilyemorehouse , você tem alguma estimativa de quando será lançado?
O PR # 959 resolve a parte crítica do problema, outros problemas, como redirecionamentos de proxy, e pode ser melhorado posteriormente. As mudanças em # 959 são muito simples e podem ser publicadas em apenas alguns minutos.

@Sitronik isso funciona para mim, obrigado

A correção de @jan-molak salvou meu dia.
+1 para a fusão do PR.

Outro +1 para fundir isso !!

Mesmo problema ... por favor, mescle!

Mesmo problema aqui

@Sitronik que funciona para mim, obrigado - por favor, mescle!
No entanto, as configurações de proxy não parecem ser lidas das variáveis ​​de ambiente (http_proxy / https_proxy), mas devem ser especificadas como parte de AxiosRequestConfig.

1 Ainda estou usando as soluções alternativas mencionadas acima, mas adoraria ver este trabalho pronto para uso.

+1 Quando você conserta isso? Mas também precisamos do no_proxy ...

@Sitronik, por favor, adicione PR. Seu pacote axios-https-proxy-fix funciona muito bem. axios.defaults.proxy = {host: ip, port: port}

Ainda é um problema, usaria esse pacote, mas seus muitos commits por trás? Isso não seria um problema: S

usaria esse pacote, mas seus muitos commits por trás?

O mesmo para mim, enquanto espero por essa mudança, vou para node-fetch + httpsProxyAgent + bluebird. Funciona bem.

@Makoehle

Ei, acabei fazendo funcionar, tente exportar http e https para "" no seu terminal

export http_proxy="" && export https_proxy=""

Obrigado, eu sei sobre as variáveis ​​env. Eu tentei de tudo. Meu palpite é que tem a ver com # 1207

Aguardando mesclagem também. Por que é tão longo?

959 foi mesclado e está disponível em 0.19.0-beta.1

Não consigo resolver no 0.19.0-beta.1, mas consertei assim

// default axios usage
import * as ProxyAgent from "proxy-agent";
const proxyAgent = new ProxyAgent(process.env.HTTPS_PROXY);  // http://127.0.0.1:1080
Axios.defaults.httpsAgent = proxyAgent;
Axios.defaults.proxy = false;

// google api usage
const Sheets = google.sheets({
    version: "v4",
    auth: key,
    httpsAgent: /dev/.test(process.env.NODE_ENV) ? proxyAgent : false,
    proxy: false
});

0.19.0-beta.1 deve corrigir o problema, estou encerrando o problema e sinta-se à vontade para criar um novo se alguém ainda tiver o problema

@Khaledgarbaya Ainda estou tendo esse problema com o 0.19.0-beta.1
Minha pergunta é como deve ser minha solicitação de proxy (e como funciona o sinalizador isHttps?).

Presumi que, para HTTPS sobre HTTP, eu simplesmente definiria o url / porta http para o proxy assim:

axiosRequestOptions.proxy = {
            host: '192.0.01',
            port: '8888',
            // isHttps: true, ?
        }

Dito isso, o acima ainda falha, então estou me perguntando se é um problema de configuração / documentação em que minha estruturação da propriedade / objeto de proxy é a causa.

@necevil
host: '192.0.01'

O 0.19.0-beta.1 ainda não funciona. Continuei recebendo Request failed with status code 400 . Perdi muito tempo com isso. Mudei para a biblioteca de pedidos e funcionou perfeitamente na primeira tentativa.

Encontrou o mesmo problema.

const axios = require('axios-https-proxy-fix')

resolveu o problema para mim.

Depois de atualizar para 0.18.0 isso parece estar funcionando para mim. Eu tive que especificar as seguintes opções para meu caso de uso:

axios.get('<some_url_on_corporate_intranet>', {
        proxy: false,
        httpsAgent: https.Agent({
            rejectUnauthorized: false // Allows the use of self-signed certificates (not recommended)
    })

tentei todas as soluções e todas falharam com base no axios 0.18
solução final :
instalar o módulo nginx ngx_http_proxy_connect_module
em seguida, solicite o url https via proxy http com solicitação-promessa

Você não precisa do Nginx se estiver usando solicitação. Solicitar proxies manipulados bem.

-
Anthony

Em 17 de janeiro de 2019, às 20h44, redbearder [email protected] escreveu:

tentei todas as soluções e todas falharam com base no axios 0.18
solução final :
instalar o módulo nginx ngx_http_proxy_connect_module
em seguida, solicite o url https via proxy http com solicitação-promessa

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Você não precisa do Nginx se estiver usando solicitação. Solicitar proxies manipulados bem. - Anthony

Em 17 de janeiro de 2019, às 20h44, redbearder @ . * > escreveu: tentei todas as soluções e todas falharam com base no axios 0.18 solução final: instale o módulo nginx ngx_http_proxy_connect_module e, em seguida, solicite o url https via proxy http com solicitação-promessa - Você está recebendo isso porque foi mencionado. Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Obrigado pela resposta
Presumo que as pessoas enviarão solicitações através de um único endereço IP como gateway de proxy, é isso que farei
No entanto, a promessa de solicitação detecta um erro "RequestError: Erro: o soquete de encapsulamento não pôde ser estabelecido, código 400"
então eu não encontro solução do Node e então tento consertar do lado do Gateway
e a solução vem acima

2 anos depois, ainda quebrado !!!

Use a promessa de solicitação.

Anthony
http://profullstack.com

Em 18 de julho de 2019, às 7h05, Yassien [email protected] escreveu:

2 anos depois, ainda quebrado !!!

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Aqui está o que fiz por aqueles que toparam com isso e ainda querem usar axios:

const HttpsProxyAgent = require("https-proxy-agent"),
      axios = require("axios");

const httpsAgent = new HttpsProxyAgent({host: "proxyhost", port: "proxyport", auth: "username:password"})

//use axios as you normally would, but specify httpsAgent in the config
axios = axios.create({httpsAgent});

Isso permitirá que você faça solicitações https em um proxy http, de forma simples e organizada.

Continuo tendo o mesmo problema após 2 anos.
Alguém está trabalhando nisso ou podemos nos juntar para contribuir?

Acabei de encontrar esse problema sozinho. Espero que vocês consigam consertar isso em algum momento.
A solução de czl032405 de usar proxy-agent funcionou para mim.

De acordo com a versão 0.19.0, isso foi corrigido. Visto que obviamente não mudou, um novo problema deve ser aberto

Esta funcionalidade ainda está quebrada no axios 0.19.
A versão 0.19.0 falha com a mensagem _ "Erro: Protocolo" http: "não compatível. Esperado" https: "" _
A versão 0.19.1 falha com _ "Erro: tempo limite de 1000 ms excedido" _. Aumentar o tempo limite não ajuda. O servidor proxy espera uma solicitação CONNECT enquanto o axios envia uma solicitação GET .

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

Questões relacionadas

samayo picture samayo  ·  3Comentários

emaincourt picture emaincourt  ·  3Comentários

jdpagley picture jdpagley  ·  3Comentários

Baoyx007 picture Baoyx007  ·  3Comentários

achingbrain picture achingbrain  ·  3Comentários