Axios: La requête vers HTTPS avec le proxy HTTP échoue

Créé le 30 mai 2017  ·  52Commentaires  ·  Source: axios/axios

Sommaire

Essayer de faire une requête HTTPS avec un proxy HTTP échoue.

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

Résulte en:

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

Le problème est déjà décrit par @chovy dans ce ticket, qui s'est terminé car OP n'avait pas le même problème : https://github.com/mzabriskie/axios/issues/662

@chovy dit :

J'ai toujours ce problème de ne pas pouvoir accéder à une URL https avec un proxy http. Je peux le faire très bien en requête et aussi en boucle à partir de shell. Quelque chose ne fonctionne pas avec axios. J'obtiens une erreur EPROTO.

Le contexte

  • version axios : v0.16.1
  • Environnement : nœud v7.10.0, Mac OSX Sierra

Commentaire le plus utile

J'ai eu un problème similaire récemment, ma solution consistait à utiliser un tunnel HTTPS sur HTTP, à spécifier explicitement le port 443 dans l'URL et à désactiver la détection automatique de proxy dans 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,
});

Plus d'informations sur la solution dans cet article .

J'espère que cela t'aides,
Jan

Tous les 52 commentaires

J'ai le même problème de requête https sur proxy. Je ne veux pas passer à request.js.

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

request.js et curl dans cette situation fonctionnent bien.

Le contexte

  • version axios : v0.16.1
  • Environnement : nœud v6.9.5, CentOS version 6.8 (finale)

Moi et un de mes collègues avons identifié le problème, un PR devrait arriver bientôt

Même problème ici : demande de ressources https derrière un proxy http.

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

Résultat:
Error: getaddrinfo ENOTFOUND http://my.proxy.com http://my.proxy.com:12345

Des progrès sur ce jusqu'à présent?

Même problème ici.

Des nouvelles ?

Mon problème n'était pas lié aux proxys, mais j'ai dû envoyer une demande GET au domaine https qui n'était pas certifié. Dans curl dans le terminal Linux, la solution consistait à utiliser le drapeau -k ou --insecure . Je n'ai pas pu trouver la solution Axios, mais avec request lib je l'ai fait comme ça; peut vous donner une idée :

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

N'hésitez pas à l'utiliser jusqu'à ce qu'ils fusionnent #959.

Idem ici, d'ailleurs les relations publiques de @mistermoe fonctionnent bien

@mistermoe je viens de quitter le travail sans réussir :(

J'utilise ce package : https://github.com/Yoctol/messaging-apis/tree/master/packages/messaging-api-messenger

Et si je remplace "axios" par le vôtre, l'erreur suivante disparaît :
"Erreur : écrire EPROTO 139800246822688 : erreur : 140770FC : routines SSLprotocole inconnu

Mais j'ai quelque chose comme :
"Erreur : getaddrinfo EAI_AGAIN"

Je remarque que le plugin Messenger fait des requêtes comme ça :
`
let client = axios.create({ ... });

client.get('...')
`

Avez-vous réussi par cette voie ou pas directement par la fonction "requête" d'Axios ?

Merci!

EDIT : Un autre a ce problème :
https://github.com/axios/axios/pull/959#issuecomment-337595602

Une chance de fusionner cela? Pourrions-nous tirer parti du config.transport nouvellement ajouté pour éviter ce problème ?

ups, même problème ici!

Malheureusement, cette pull request ne fusionne pas, mais j'ai résolu ce problème https://github.com/Sitronik/axios

J'ai eu un problème similaire récemment, ma solution consistait à utiliser un tunnel HTTPS sur HTTP, à spécifier explicitement le port 443 dans l'URL et à désactiver la détection automatique de proxy dans 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,
});

Plus d'informations sur la solution dans cet article .

J'espère que cela t'aides,
Jan

@jan-molak Mon correctif est facile à utiliser :

  1. npm installer axios-https-proxy-fix
  2. Puis
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 solution de @jan-molak a également fonctionné pour moi. Ce serait vraiment bien de ne pas avoir à forcer le numéro de port sur l'url.

@jan-molak @Sitronik J'ai essayé votre solution mais j'obtiens l'erreur : socket raccrocher.
Ce que je veux, c'est voir comment la demande passe par charles, alors j'ouvre charles et mets le proxy sur {host:'127.0.0.1', port:8888 } dans mon code. Je ne sais pas s'il convient d'utiliser votre solution

Une chance d'être inclus dans 0.19.0 ?

@astappev, cela semble définitivement avoir besoin d'un correctif dès que possible. Il y a beaucoup de problèmes connexes et de relations publiques que je dois passer au crible, mais je vais l'ajouter à ma feuille de route 0.19.0.

@emilyemorehouse , avez-vous une estimation de sa date de sortie ?
Le PR #959 résout une partie critique du problème, d'autres problèmes tels que les redirections de proxy et peuvent donc être améliorés ultérieurement. Les changements dans #959 sont assez simples et peuvent être publiés en quelques minutes.

@Sitronik qui fonctionne pour moi merci

Le correctif de @jan-molak m'a sauvé la journée.
+1 à la fusion du PR.

Un autre +1 pour fusionner ça !!

Même problème... fusionnez s'il vous plait !

Même problème ici

@Sitronik qui fonctionne pour moi merci - fusionnez s'il vous plaît !
Cependant, les paramètres du proxy ne semblent pas être lus à partir des variables d'environnement (http_proxy / https_proxy) mais doivent être spécifiés dans le cadre d'AxiosRequestConfig.

+1 J'utilise toujours les solutions de contournement mentionnées ci-dessus, mais j'adorerais voir ce travail prêt à l'emploi.

+1 Quand réparez-vous cela ? Mais nous avons aussi besoin de no_proxy...

@Sitronik s'il vous plaît ajouter PR. Votre forfait axios-https-proxy-fix fonctionne très bien. axios.defaults.proxy = {host: ip, port: port}

Toujours un problème, utiliseriez-vous ce package mais ses nombreux commits sont-ils en retard ? Est-ce que ce ne serait pas un problème :S

utiliserait ce package mais ses nombreux commits derrière?

Idem pour moi en attendant ce changement, je vais pour node-fetch + httpsProxyAgent + bluebird. Fonctionne bien.

@Makoehle

Hé, j'ai fini par le faire fonctionner, essayez d'exporter http et https vers "" sur votre terminal

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

Merci, je connais les variables env. J'ai tout essayé. Je suppose que cela a à voir avec #1207

En attente de fusion aussi. Pourquoi c'est si long ?

959 a été fusionné et est disponible en 0.19.0-beta.1

Je ne peux pas le résoudre dans 0.19.0-beta.1, mais j'ai corrigé comme ça

// 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 devrait résoudre le problème, je ferme le problème et n'hésitez pas à en créer un nouveau si quelqu'un a toujours le problème

@Khaledgarbaya J'ai toujours ce problème avec 0.19.0-beta.1
Ma question est à quoi devrait ressembler ma demande de proxy (et comment fonctionne le drapeau isHttps ?).

J'ai supposé que pour HTTPS sur HTTP, je définirais simplement l'URL / le port http pour le proxy comme ceci :

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

Cela étant dit, ce qui précède échoue toujours, je me demande donc s'il s'agit d'un problème de configuration / documentation dont ma structuration de la propriété / de l'objet proxy en est la cause.

@necevil
hôte : '192.0.01'

Le 0.19.0-beta.1 ne fonctionne toujours Request failed with status code 400 . J'ai perdu beaucoup de temps là-dessus. Je suis passé à la bibliothèque de requêtes et cela a fonctionné comme un charme du premier coup.

A couru dans le même problème.

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

a résolu le problème pour moi.

Après la mise à jour vers 0.18.0 cela semble fonctionner pour moi. J'ai dû spécifier les options suivantes pour mon cas d'utilisation :

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

essayé toutes les solutions et toutes les bases ont échoué sur axios 0.18
solution finale :
installer le module nginx ngx_http_proxy_connect_module
puis demandez l'URL https via le proxy http avec request-promise

Vous n'avez pas besoin de Nginx si vous utilisez request. Demande de proxys traités correctement.

-
Antoine

Le 17 janvier 2019, à 20h44, redbearder [email protected] a écrit :

essayé toutes les solutions et toutes les bases ont échoué sur axios 0.18
solution finale :
installer le module nginx ngx_http_proxy_connect_module
puis demandez l'URL https via le proxy http avec request-promise

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub ou coupez le fil de discussion.

Vous n'avez pas besoin de Nginx si vous utilisez request. Demande de proxys traités correctement. - Antoine

Le 17 janvier 2019 à 20h44, redbearder @ . * > a écrit: essayé toutes les solutions et toutes les bases ont échoué sur la solution finale axios 0.18: installez le module nginx ngx_http_proxy_connect_module puis demandez l'URL https via le proxy http avec request-promise - Vous recevez ceci parce que vous avez été mentionné. Répondez directement à cet e-mail, affichez-le sur GitHub ou coupez le fil de discussion.

Merci de votre réponse
Je suppose que les gens enverront des demandes via une seule adresse IP en tant que passerelle proxy, c'est ce que je ferai
Cependant, la demande-promesse attrape une erreur "RequestError: Error: tunnelling socket n'a pas pu être établie, code 400"
donc je ne trouve pas de solution à partir de Node, puis j'essaie de la réparer du côté de la passerelle
et la solution sort ci-dessus

2 ans plus tard, toujours cassé !!!

Utilisez la promesse de demande.

Antoine
http://profullstack.com

Le 18 juillet 2019, à 7h05, Yassien [email protected] a écrit :

2 ans plus tard, toujours cassé !!!

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub ou coupez le fil de discussion.

Voici ce que j'ai fait pour ceux qui tombent sur cela et veulent toujours utiliser 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});

Cela vous permettra de faire des requêtes https sur un proxy http, simple et soigné.

Toujours le même problème après 2 ans.
Quelqu'un y travaille-t-il ou pouvons-nous nous rejoindre pour contribuer ?

Je viens de rencontrer ce problème moi-même. En espérant que vous puissiez résoudre ce problème à un moment donné.
La solution de czl032405 consistant à utiliser proxy-agent fonctionné pour moi.

Selon la version 0.19.0, cela a été corrigé. Comme ce n'est manifestement pas le cas, un nouveau numéro devrait être ouvert

Cette fonctionnalité est toujours cassée dans axios 0.19.
La version 0.19.0 échoue avec le message _"Erreur : protocole "http:" non pris en charge. "https:"" attendu
La version 0.19.1 échoue avec _"Error : timeout de 1000ms dépassé"_. Augmenter le délai d'attente n'aide pas. Le serveur proxy attend une requête CONNECT tandis qu'axios envoie une requête GET .

Cette page vous a été utile?
0 / 5 - 0 notes