Axios: Anfrage an HTTPS mit HTTP-Proxy schlägt fehl

Erstellt am 30. Mai 2017  ·  52Kommentare  ·  Quelle: axios/axios

Zusammenfassung

Der Versuch, eine HTTPS-Anfrage mit einem HTTP-Proxy auszuführen, schlägt fehl.

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

Ergebnisse in:

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

Das Problem wird bereits von @chovy in diesem Ticket beschrieben, das geschlossen wurde, da OP nicht das gleiche Problem hatte: https://github.com/mzabriskie/axios/issues/662

@chovy sagt:

Ich habe immer noch dieses Problem, dass ich mit einem http-Proxy keine https-URL erreichen kann. Ich kann es auf Anfrage und auch in Curl von Shell gut machen. Irgendwas funktioniert nicht mit Axios. Ich erhalte einen EPROTO-Fehler.

Kontext

  • Axios-Version: v0.16.1
  • Umgebung: Knoten v7.10.0, Mac OSX Sierra

Hilfreichster Kommentar

Hatte kürzlich ein ähnliches Problem, meine Lösung bestand darin, einen HTTPS-über-HTTP-Tunnel zu verwenden, Port 443 explizit in der URL anzugeben und die automatische Proxy-Erkennung in axios zu deaktivieren:

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,
});

Mehr zur Lösung in diesem Artikel .

Hoffe das hilft,
Jan

Alle 52 Kommentare

Ich habe das gleiche Problem mit der https-Anfrage über den Proxy. Ich möchte nicht zu request.js wechseln.

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

request.js und curl funktionieren in dieser Situation gut.

Kontext

  • Axios-Version: v0.16.1
  • Umgebung: Knoten v6.9.5, CentOS-Release 6.8 (Final)

Ich und ein Kollege von mir haben das Problem identifiziert, eine PR sollte bald kommen

Gleiches Problem hier: Anfordern von https-Ressourcen hinter einem http-Proxy.

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

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

Gibt es diesbezüglich bisher Fortschritte?

Selbes Problem hier.

Irgendwelche Neuigkeiten ?

Mein Problem hatte nichts mit Proxys zu tun, ich musste eine GET-Anfrage an eine nicht zertifizierte Domain https senden. In curl im Linux-Terminal bestand die Lösung darin, das Flag -k oder --insecure verwenden. Ich konnte zwar keine Axios-Lösung finden, aber mit request lib habe ich es so gemacht; könnte dir eine Idee geben:

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

Fühlen Sie sich frei, dies zu verwenden, bis # 959 zusammengeführt wird.

Gleiches hier, übrigens funktioniert die PR von @mistermoe

@mistermoe Ich habe gerade die Arbeit verlassen, ohne dass es gelungen ist:(

Ich benutze dieses Paket: https://github.com/Yoctol/messaging-apis/tree/master/packages/messaging-api-messenger

Und wenn ich "axios" durch deins ersetze, verschwindet folgender Fehler:
"Fehler: EPROTO schreiben 139800246822688: Fehler:140770FC :SSL- Routinen:SSL23_GET_SERVER_HELLO :unbekanntes Protokoll:../deps/openssl/openssl/ssl/s23_clnt.c :794"

Aber ich habe sowas wie:
"Fehler: getaddrinfo EAI_AGAIN"

Mir ist aufgefallen, dass das Messenger-Plugin solche Anfragen stellt:
`
let client = axios.create({ ... });

client.get('...')
`

Ist Ihnen das auf diesem Weg gelungen oder nicht direkt per Axios "Anfrage"-Funktion?

Vielen Dank!

EDIT: Noch einer mit diesem Problem:
https://github.com/axios/axios/pull/959#issuecomment -337595602

Gibt es eine Möglichkeit das zusammenzuführen? Könnten wir das neu hinzugefügte config.transport nutzen, um dieses Problem zu vermeiden?

Ups, gleiches Problem hier!

Leider wird dieser Pull-Request nicht zusammengeführt, aber ich habe dieses Problem behoben https://github.com/Sitronik/axios

Hatte kürzlich ein ähnliches Problem, meine Lösung bestand darin, einen HTTPS-über-HTTP-Tunnel zu verwenden, Port 443 explizit in der URL anzugeben und die automatische Proxy-Erkennung in axios zu deaktivieren:

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,
});

Mehr zur Lösung in diesem Artikel .

Hoffe das hilft,
Jan

@jan-molak Mein Fix ist einfach zu bedienen:

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

Die Lösung von @jan-molak hat auch bei mir funktioniert. Es wäre jedoch wirklich schön, die Portnummer nicht auf der URL erzwingen zu müssen.

@jan-molak @Sitronik Ich habe Ihre Lösung ausprobiert, bekomme aber Fehler: Socket
Ich möchte sehen, wie die Anfrage durch Charles geht, also öffne ich Charles und setze den Proxy in meinem Code auf {host:'127.0.0.1', port:8888 }. Ich weiß nicht, ob es für Ihre Lösung geeignet ist

Gibt es eine Chance, in 0.19.0 aufgenommen zu werden?

@astappev das sieht definitiv so aus, als ob es so schnell wie möglich repariert werden muss. Es gibt viele verwandte Themen und PRs, die ich durchgehen muss, aber ich werde sie meiner 0.19.0-Roadmap hinzufügen.

@emilyemorehouse , hast du eine Schätzung, wann es veröffentlicht wird?
Der PR #959 löst einen kritischen Teil des Problems, andere Probleme wie Proxy-Umleitungen und kann so später verbessert werden. Die Änderungen in #959 sind ziemlich einfach und können in wenigen Minuten veröffentlicht werden.

@Sitronik das funktioniert bei mir danke

Der Fix von @jan-molak hat mir den Tag gerettet.
+1 zum Zusammenführen der PR.

Noch ein +1 zum Zusammenführen!!

Gleiches Problem... bitte zusammenführen!

Gleiches Problem hier

@Sitronik das funktioniert bei mir danke - bitte zusammenführen!
Die Proxy-Einstellungen scheinen jedoch nicht aus Umgebungsvariablen (http_proxy / https_proxy) gelesen zu werden, sondern müssen als Teil von AxiosRequestConfig angegeben werden.

+1 Verwenden Sie immer noch die oben genannten Workarounds, würden Sie aber gerne sehen, dass diese Funktion sofort einsatzbereit ist.

+1 Wenn Sie das beheben? Aber wir brauchen auch no_proxy...

@Sitronik bitte fügen Sie PR hinzu. Ihr Paket axios-https-proxy-fix funktioniert einwandfrei. axios.defaults.proxy = {host: ip, port: port}

Immer noch ein Problem, würdest du dieses Paket verwenden, aber die vielen Commits dahinter? Wäre das kein Thema :S

würde dieses Paket verwenden, aber seine vielen Commits dahinter?

Das gleiche gilt für mich, während ich auf diese Änderung warte. Ich gehe für Node-Fetch + httpsProxyAgent + Bluebird. Funktioniert gut.

@Makoehle

Hey, am Ende habe ich es zum Laufen gebracht, versuche http und https nach "" auf deinem Terminal zu exportieren

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

Danke, ich kenne mich mit env-Variablen aus. Ich habe alles versucht. Ich vermute, es hat mit #1207 zu tun

Warte auch auf Zusammenführung. Warum ist es so lang?

959 wurde zusammengeführt und ist in 0.19.0-beta.1 verfügbar

Ich kann es in 0.19.0-beta.1 nicht lösen, aber ich habe es so behoben

// 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 sollte das Problem beheben, ich schließe das Problem und kann gerne ein neues erstellen, falls noch jemand das Problem hat

@Khaledgarbaya Ich habe dieses Problem immer noch mit 0.19.0-beta.1
Meine Frage ist, wie sollte meine Proxy-Anfrage aussehen (und wie funktioniert das isHttps-Flag?).

Ich ging davon aus, dass ich für HTTPS über HTTP einfach die http-URL / den http-Port für den Proxy wie folgt festlegen würde:

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

Davon abgesehen schlägt das oben Genannte immer noch fehl, daher frage ich mich, ob es sich um ein Konfigurations- / Dokumentationsproblem handelt, bei dem meine Strukturierung der Proxy-Eigenschaft / des Proxy-Objekts die Ursache ist.

@necevil
Host: '192.0.01'

Die 0.19.0-beta.1 funktioniert immer noch nicht . Ich habe immer Request failed with status code 400 . Habe viel Zeit damit verschwendet. Zur Anforderungsbibliothek gewechselt und es funktionierte beim ersten Versuch wie ein Zauber.

Bin auf das gleiche Problem gestoßen.

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

hat das Problem bei mir behoben.

Nach dem Update auf 0.18.0 scheint dies bei mir zu funktionieren. Ich musste jedoch die folgenden Optionen für meinen Anwendungsfall angeben:

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

versuchte alle Lösungen und alle fehlgeschlagenen Basis auf Axios 0.18
endgültige Lösung :
nginx-Modul installieren ngx_http_proxy_connect_module
dann https-URL über http-Proxy mit Request-Promise anfordern

Sie benötigen Nginx nicht, wenn Sie request verwenden. Anfrage bearbeitete Proxys in Ordnung.

-
Anthony

Am 17. Januar 2019 um 20:44 Uhr schrieb redbearder [email protected] :

versuchte alle Lösungen und alle fehlgeschlagenen Basis auf Axios 0.18
endgültige Lösung :
nginx-Modul installieren ngx_http_proxy_connect_module
dann https-URL über http-Proxy mit Request-Promise anfordern


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

Sie benötigen Nginx nicht, wenn Sie request verwenden. Anfrage bearbeitete Proxys in Ordnung. - Anthony

Am 17. Januar 2019, um 20:44 Uhr, redbearder @ . * > schrieb: Alle Lösungen ausprobiert und alle fehlgeschlagen Basis auf Axios 0.18 Endlösung: Nginx-Modul installieren ngx_http_proxy_connect_module dann https-URL über http-Proxy mit Anfrage-Versprechen anfordern — Sie erhalten dies, weil Sie erwähnt wurden. Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

Danke für deine Antwort
Ich gehe davon aus, dass die Leute Anfragen über eine einzige IP-Adresse als Proxy-Gateway senden, das werde ich tun
Request-Promise fängt jedoch einen Fehler "RequestError: Fehler: Tunneling-Socket konnte nicht hergestellt werden, Code 400" ab.
Also finde ich keine Lösung von Node und versuche dann, sie von der Gateway-Seite aus zu beheben
und die lösung kommt oben raus

2 Jahre später immer noch kaputt!!!

Anfrageversprechen verwenden.

Anthony
http://profullstack.com

Am 18. Juli 2019 um 7:05 Uhr schrieb Yassien [email protected] :

2 Jahre später immer noch kaputt!!!


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

Folgendes habe ich für diejenigen getan, die darüber stolpern und immer noch Axios verwenden möchten:

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});

Auf diese Weise können Sie einfach und übersichtlich https-Anfragen über einen http-Proxy stellen.

Habe nach 2 Jahren immer noch das gleiche Problem.
Arbeitet jemand daran oder können wir mitmachen?

Bin gerade selbst auf dieses Problem gestoßen. Ich hoffe ihr könnt das irgendwann beheben.
Die Lösung von czl032405, proxy-agent hat für mich funktioniert.

Laut Version 0.19.0 wurde dies behoben. Da dies offensichtlich nicht der Fall ist, sollte eine neue Ausgabe eröffnet werden

Diese Funktionalität ist in axios 0.19 noch defekt.
Version 0.19.0 schlägt mit der Meldung _"Fehler: Protokoll "http:" nicht unterstützt. Erwartet "https:""_ fehl
Version 0.19.1 schlägt fehl mit _"Fehler: Timeout von 1000ms überschritten"_. Das Erhöhen des Timeouts hilft nicht. Der Proxy-Server erwartet eine CONNECT Anfrage, während axios eine GET Anfrage sendet.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen