Axios: 使用 HTTP 代理请求 HTTPS 失败

创建于 2017-05-30  ·  52评论  ·  资料来源: axios/axios

概括

尝试使用 HTTP 代理执行 HTTPS 请求失败。

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

结果是:

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

@chovy在这张票中已经描述了这个问题,最终因为 OP 没有同样的问题而关闭: https :

@chovy说:

我仍然遇到无法使用 http 代理访问 https url 的问题。 我可以在请求中做得很好,也可以在 shell 的 curl 中完成。 一些不适用于 axios。 我收到 EPROTO 错误。

语境

  • axios 版本:v0.16.1
  • 环境:node v7.10.0,Mac OSX Sierra

最有用的评论

最近有一个类似的问题,我的解决方案是使用 HTTPS-over-HTTP 隧道,在 URL 中明确指定端口 443 并在 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,
});

更多关于本文中的解决方案。

希望这可以帮助,

所有52条评论

我在代理上遇到了同样的 https 请求问题。 我不想转移到 request.js。

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

request.js 和 curl 在这种情况下效果很好。

语境

  • axios 版本:v0.16.1
  • 环境:node v6.9.5,CentOS release 6.8 (Final)

我和我的一个同事发现了这个问题,公关应该很快就会到来

同样的问题:在 http 代理后面请求 https 资源。

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

结果:
Error: getaddrinfo ENOTFOUND http://my.proxy.com http://my.proxy.com:12345

到目前为止,这方面有什么进展吗?

同样的问题在这里。

任何新闻 ?

我的问题与代理无关,我必须将 GET 请求发送到未经认证的https域。 在 linux 终端内的curl ,解决方案是使用-k--insecure标志。 我找不到 Axios 解决方案,但是使用request lib 我是这样做的; 可能会给你想法:

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

随意使用它,直到它们合并#959。

同样在这里,顺便说一句@mtermoe的公关工作正常

@mtermoe我刚刚离开工作没有成功:(

我使用这个包: https :

如果我用你的替换“axios”,以下错误就会消失:
“错误:写 EPROTO 139800246822688:错误:140770FC :SSL例程:SSL23_GET_SERVER_HELLO :未知协议:../deps/openssl/openssl/ssl/s23_clnt.c :794”

但我有类似的东西:
“错误:getaddrinfo EAI_AGAIN”

我注意到 Messenger 插件发出这样的请求:
`
让客户端 = axios.create({ ... });

client.get('...')
`

你是通过这种方式成功的还是直接通过axios的“请求”功能成功的?

谢谢!

编辑:另一个有这个问题:
https://github.com/axios/axios/pull/959#issuecomment -337595602

有机会合并吗? 我们可以利用新添加的 config.transport 来避免这个问题吗?

ups,同样的问题!

不幸的是,这个拉取请求没有合并,但我修复了这个问题https://github.com/Sitronik/axios

最近有一个类似的问题,我的解决方案是使用 HTTPS-over-HTTP 隧道,在 URL 中明确指定端口 443 并在 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,
});

更多关于本文中的解决方案。

希望这可以帮助,

@jan-molak 我的修复很容易使用:

  1. npm install axios-https-proxy-fix
  2. 然后
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});
}

@jan-molak 的解决方案也对我有用。 不过,不必在 url 上强制使用端口号真的很好。

@jan-molak @Sitronik我试过你的解决方案,但得到错误:套接字挂断。
我想要的是查看请求如何通过查尔斯,所以我打开查尔斯,并在我的代码中将代理设置为 {host:'127.0.0.1', port:8888 }。 不知道是否适合使用你的解决方案

有机会被包含在 0.19.0 中吗?

@astappev这看起来肯定需要尽快修复。 我需要筛选很多相关问题和 PR,但我会​​将其添加到我的 0.19.0 路线图中。

@emilyemorehouse ,你估计什么时候发布?
PR #959 解决了问题的关键部分,其他问题如代理重定向等可以在以后改进。 #959 中的更改非常简单,只需几分钟即可发布。

@Sitronik对我

@jan-molak 的修复拯救了我的一天。
+1 合并 PR。

另一个+1合并这个!!

同样的问题...请合并!

同样的问题在这里

@Sitronik对我
然而,代理设置似乎不是从环境变量(http_proxy / https_proxy)中读取的,而是必须指定为 AxiosRequestConfig 的一部分。

+1 仍在使用上面提到的变通方法,但很想看到这项工作开箱即用。

+1 什么时候解决这个问题? 但是我们也需要 no_proxy ......

@Sitronik请添加 PR。 你的包裹axios-https-proxy-fix工作得很好。 axios.defaults.proxy = {host: ip, port: port}

仍然是一个问题,会使用那个包但它后面有很多提交吗? 这不是问题吗:S

会使用那个包,但它后面有很多提交吗?

在等待更改时对我来说也是如此,我将使用 node-fetch + httpsProxyAgent + bluebird。 工作正常。

@Makoehle

嘿,我最终让它工作了,尝试在您的终端上将 http 和 https 导出到“”

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

谢谢我知道 env 变量。 我尝试了一切。 我的猜测是它与#1207有关

也在等合并。 为什么这么长?

959 已合并并在 0.19.0-beta.1 中可用

我无法在 0.19.0-beta.1 中解决它,但我是这样修复的

// 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 应该解决这个问题,我正在关闭这个问题,如果有人仍然遇到这个问题,请随时创建一个新的

@Khaledgarbaya我仍然遇到 0.19.0-beta.1 的这个问题
我的问题是我的代理请求应该是什么样子(以及 isHttps 标志如何工作?)。

我假设对于基于 HTTP 的 HTTPS,我会简单地为代理设置 http url/端口,如下所示:

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

话虽如此,以上仍然失败,所以我想知道是否是配置/文档问题,我的代理属性/对象的结构是原因。

@necevil
主机:'192.0.01'

0.19.0-beta.1 仍然不起作用。 我一直收到Request failed with status code 400 。 在这上面浪费了很多时间。 切换到请求库,第一次尝试时它就像一个魅力。

遇到了同样的问题。

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

为我解决了问题。

更新到0.18.0这似乎对我有用。 不过,我必须为我的用例指定以下选项:

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

基于 axios 0.18 尝试了所有解决方案和所有失败
最终解决方案:
安装 nginx 模块ngx_http_proxy_connect_module
然后通过带有request-promise 的http 代理请求 https url

如果您使用请求,则不需要 Nginx。 请求处理代理很好。

——
安东尼

2019 年 1 月 17 日晚上 8:44,redbearder [email protected]写道:

基于 axios 0.18 尝试了所有解决方案和所有失败
最终解决方案:
安装 nginx 模块 ngx_http_proxy_connect_module
然后通过带有 request-promise 的 http 代理请求 https url


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看,或将线程静音。

如果您使用请求,则不需要 Nginx。 请求处理代理很好。 - 安东尼

在 2019 年 1 月 17 日,晚上 8:44,redbearder @* > 写道:基于 axios 0.18 最终解决方案尝试了所有解决方案但都失败了:安装 nginx 模块 ngx_http_proxy_connect_module 然后通过带有 request-promise 的 http 代理请求 https url — 您收到此消息是因为您被提及。 直接回复此邮件,在 GitHub 上查看,或将线程静音。

谢谢你的回复
我假设人们将通过单个 IP 地址作为代理网关发送请求,这就是我要做的
但是请求承诺捕获错误“RequestError:错误:无法建立隧道套接字,代码400”
所以我没有从 Node 找到解决方案,然后我尝试从网关端修复它
解决方案就出来了

2年了,还是坏了!!!

使用请求承诺。

安东尼
http://profullstack.com

在2019年7月18日,在上午7:05,Yassien [email protected]写道:

2年了,还是坏了!!!


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看,或将线程静音。

这是我为那些偶然发现并仍然想使用 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});

这将让您通过 http 代理发出 https 请求,简单而整洁。

2年后仍然有同样的问题。
有人在做这方面的工作吗,或者我们可以加入进来做出贡献吗?

刚刚自己遇到了这个问题。 希望你们能在某个时候解决这个问题。
czl032405 使用proxy-agent的解决方案对我有用。

根据 0.19.0 版本,此问题已得到修复。 由于它显然没有,所以应该开一个新的问题

这个功能在 axios 0.19 中仍然被破坏。
版本 0.19.0 失败并显示消息 _"Error: Protocol "http:" not supported. Expected "https:""_
0.19.1 版失败并显示 _“错误:超过 1000 毫秒超时”_。 增加超时没有帮助。 代理服务器期望CONNECT请求,而 axios 发送GET请求。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

achingbrain picture achingbrain  ·  3评论

reggi picture reggi  ·  3评论

Shu-Ji picture Shu-Ji  ·  3评论

ghprod picture ghprod  ·  3评论

ghost picture ghost  ·  3评论