Axios: La solicitud a HTTPS con proxy HTTP falla

Creado en 30 may. 2017  ·  52Comentarios  ·  Fuente: axios/axios

Resumen

Intentar realizar una solicitud HTTPS con un proxy HTTP falla.

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

Resultados en:

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

El problema ya lo describe @chovy en este ticket, que terminó cerrado ya que OP no tenía el mismo problema: https://github.com/mzabriskie/axios/issues/662

@chovy dice:

Todavía tengo este problema al no poder acceder a una URL https con un proxy http. Puedo hacerlo bien a pedido y también en curl de shell. Algo que no funciona con axios. Recibo un error EPROTO.

Contexto

  • versión de axios: v0.16.1
  • Entorno: nodo v7.10.0, Mac OSX Sierra

Comentario más útil

Recientemente tuve un problema similar, mi solución fue usar un túnel HTTPS sobre HTTP, especificar el puerto 443 explícitamente en la URL y deshabilitar la detección automática de proxy en 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,
});

Más sobre la solución en este artículo .

Espero que esto ayude,
ene

Todos 52 comentarios

Tengo el mismo problema de solicitud https sobre proxy. No quiero moverme a 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 y curl en esta situación funcionan bien.

Contexto

  • versión de axios: v0.16.1
  • Entorno: nodo v6.9.5, versión 6.8 de CentOS (final)

Un colega y yo identificamos el problema, pronto habrá un RP

El mismo problema aquí: Solicitar recursos https detrás de un 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

¿Algún progreso en esto hasta ahora?

El mismo problema aqui.

Hay noticias ?

Aunque mi problema no estaba relacionado con los proxies, tuve que enviar una solicitud GET al dominio https que no estaba certificado. En curl dentro de la terminal de Linux, la solución fue usar la bandera -k o --insecure . Aunque no pude encontrar la solución de Axios, pero con request lib lo hice así; podría darte una idea:

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) => {
...

Siéntase libre de usar esto hasta que se combinen # 959.

Lo mismo aquí, por cierto, las relaciones públicas de @mistermoe funcionan bien

@mistermoe Acabo de salir del trabajo sin lograrlo :(

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

Y si reemplazo "axios" por el tuyo, el siguiente error desaparece:
"Error: escriba EPROTO 139800246822688: error: 140770FC : rutinas SSL protocolo desconocido

Pero tengo algo como:
"Error: getaddrinfo EAI_AGAIN"

Noto que el complemento Messenger realiza solicitudes como esa:
'
dejar cliente = axios.create ({...});

cliente.get ('...')
'

¿Tuvo éxito de esta manera o no directamente mediante la función de "solicitud" de Axios?

¡Gracias!

EDITAR: Otro que tiene este problema:
https://github.com/axios/axios/pull/959#issuecomment -337595602

¿Alguna posibilidad de fusionar esto? ¿Podríamos aprovechar el config.transport recién agregado para evitar este problema?

ups, el mismo problema aquí!

Desafortunadamente, esta solicitud de extracción no se fusionó, pero solucioné este problema https://github.com/Sitronik/axios

Recientemente tuve un problema similar, mi solución fue usar un túnel HTTPS sobre HTTP, especificar el puerto 443 explícitamente en la URL y deshabilitar la detección automática de proxy en 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,
});

Más sobre la solución en este artículo .

Espero que esto ayude,
ene

@ jan-molak Mi solución es fácil de usar:

  1. npm instalar axios-https-proxy-fix
  2. Luego
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});
}

La solución de @ jan-molak también funcionó para mí. Sin embargo, sería realmente bueno no tener que forzar el número de puerto en la URL.

@ jan-molak @Sitronik Probé su solución pero aparece Error: socket hang up.
Lo que quiero es ver cómo pasa la solicitud a través de charles, así que abro charles y configuro el proxy en {host: '127.0.0.1', puerto: 8888 } en mi código. No sé si es adecuado usar tu solución.

¿Alguna posibilidad de ser incluido en 0.19.0?

@astappev, esto definitivamente parece que necesita una solución lo antes posible. Hay muchos problemas relacionados y relaciones públicas que debo analizar, pero lo agregaré a mi hoja de ruta 0.19.0.

@emilyemorehouse , ¿tienes alguna estimación de cuándo se lanzará?
El PR # 959 resuelve una parte crítica del problema, otros problemas como las redirecciones de proxy y, por lo tanto, se pueden mejorar más adelante. Los cambios en el n. ° 959 son bastante simples y se pueden publicar en solo unos minutos.

@Sitronik eso me funciona gracias

La solución de @ jan-molak me salvó el día.
+1 para fusionar el PR.

¡¡Otro +1 para fusionar esto !!

El mismo problema ... ¡fusiona!

El mismo problema aquí

@Sitronik eso me funciona gracias, ¡por favor únanse!
Sin embargo, la configuración del proxy no parece leerse de las variables de entorno (http_proxy / https_proxy), pero debe especificarse como parte de AxiosRequestConfig.

+1 Todavía estoy usando los métodos alternativos mencionados anteriormente, pero me encantaría ver que esto funcione de inmediato.

+1 ¿Cuándo arreglas esto? Pero también necesitamos no_proxy ...

@Sitronik, por favor agregue relaciones públicas. Su paquete axios-https-proxy-fix funciona bien. axios.defaults.proxy = {host: ip, port: port}

Sigue siendo un problema, ¿usaría ese paquete pero hay muchas confirmaciones detrás? ¿Sería eso un problema? S

¿Usaría ese paquete pero hay muchas confirmaciones detrás?

Lo mismo para mí mientras espero ese cambio, voy a buscar nodo + httpsProxyAgent + bluebird. Funciona bien.

@Makoehle

Oye, terminé haciendo que funcionara, intenta exportar http y https a "" en tu terminal

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

Gracias, sé acerca de las variables env. Probé todo. Supongo que tiene que ver con el n. ° 1207

Esperando la fusión también. ¿Por qué es tan largo?

959 se fusionó y está disponible en 0.19.0-beta.1

No puedo resolverlo en 0.19.0-beta.1, pero lo arreglé así

// 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 debería solucionar el problema, estoy cerrando el problema y siéntase libre de crear uno nuevo si alguien todavía tiene el problema

@Khaledgarbaya Todavía tengo este problema con 0.19.0-beta.1
Mi pregunta es ¿cómo debería verse mi solicitud de proxy (y cómo funciona la marca isHttps?).

Supuse que para HTTPS sobre HTTP simplemente establecería la URL / puerto http para el proxy de esta manera:

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

Dicho esto, lo anterior aún falla, así que me pregunto si es un problema de configuración / documentación donde mi estructuración de la propiedad / objeto del proxy es la causa.

@necevil
anfitrión: '192.0.01'

La 0.19.0-beta.1 todavía no funciona. Seguí recibiendo Request failed with status code 400 . Perdí mucho tiempo en esto. Cambió a la biblioteca de solicitudes y funcionó como un encanto en el primer intento.

Me encontré con el mismo problema.

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

solucionó el problema por mí.

Después de actualizar a 0.18.0 esto parece funcionar para mí. Sin embargo, tuve que especificar las siguientes opciones para mi 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)
    })

Probé todas las soluciones y todas las bases fallidas en axios 0.18
solución final :
instalar el módulo nginx ngx_http_proxy_connect_module
luego solicite la URL https a través del proxy http con la promesa de solicitud

No necesita Nginx si está utilizando request. Solicitar proxies manejados bien.

-
Antonio

El 17 de enero de 2019, a las 8:44 p.m., redbearder [email protected] escribió:

Probé todas las soluciones y todas las bases fallidas en axios 0.18
solución final :
instalar el módulo nginx ngx_http_proxy_connect_module
luego solicite la URL https a través del proxy http con la promesa de solicitud

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencie el hilo.

No necesita Nginx si está utilizando request. Solicitar proxies manejados bien. - Anthony
...
El 17 de enero de 2019, a las 8:44 p.m., redbearder @ . * > escribió: probé todas las soluciones y todas las bases fallidas en axios 0.18 solución final: instale el módulo nginx ngx_http_proxy_connect_module y luego solicite la URL https a través del proxy http con solicitud-promesa: está recibiendo esto porque fue mencionado. Responda a este correo electrónico directamente, véalo en GitHub o silencie el hilo.

Gracias por tu respuesta
Supongo que la gente enviará solicitudes a través de una única dirección IP como puerta de enlace proxy, eso es lo que haré
Sin embargo, la solicitud-promesa detecta un error "RequestError: Error: no se pudo establecer el socket de tunelización, código 400"
así que no encuentro una solución en el nodo y luego trato de solucionarlo desde el lado de la puerta de enlace
y la solución sale arriba

2 años después, todavía roto !!!

Utilice la promesa de solicitud.

Antonio
http://profullstack.com

El 18 de julio de 2019, a las 7:05 a.m., Yassien [email protected] escribió:

2 años después, todavía roto !!!

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencie el hilo.

Esto es lo que hice por aquellos que se topan con esto y todavía quieren 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});

Esto le permitirá realizar solicitudes https a través de un proxy http, de forma simple y ordenada.

Sigue teniendo el mismo problema después de 2 años.
¿Alguien está trabajando en esto o podemos unirnos para contribuir?

Me encontré con este problema yo mismo. Espero que puedan arreglar esto en algún momento.
La solución de czl032405 de usar proxy-agent funcionó para mí.

Según la versión 0.19.0, esto se ha solucionado. Como obviamente no lo ha hecho, debería abrirse una nueva edición.

Esta funcionalidad todavía está rota en axios 0.19.
La versión 0.19.0 falla con el mensaje _ "Error: Protocolo" http: "no admitido. Se esperaba" https: "" _
La versión 0.19.1 falla con _ "Error: se excedió el tiempo de espera de 1000 ms" _. Aumentar el tiempo de espera no ayuda. El servidor proxy espera una solicitud CONNECT mientras que axios envía una solicitud GET .

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Baoyx007 picture Baoyx007  ·  3Comentarios

reggi picture reggi  ·  3Comentarios

Shu-Ji picture Shu-Ji  ·  3Comentarios

shaosh picture shaosh  ·  3Comentarios

achingbrain picture achingbrain  ·  3Comentarios