【问题标题】:Proxy HTTPS with HTTP in Node.js express在 Node.js express 中使用 HTTP 代理 HTTPS
【发布时间】:2015-07-23 01:47:43
【问题描述】:

我编写了一个快速应用程序作为 HTTP 代理,用于拦截和分析一些网络流量。我的应用感兴趣的流量部分都是 HTTP,但我仍然希望我的应用代理 HTTPS,以便用户无需额外设置即可使用它。

我的 express 应用是使用 HTTP 服务器创建的。测试时,我使用 SwitchyOmega 将 Chrome 中的代理设置更改为使用 HTTP 代理 HTTPS 连接。 HTTP 运行良好,但我的 express 应用无法获取这些 HTTPS 代理请求。

于是我写了一个简单的TCP代理来检查它们,发现它们是这样的:

CONNECT HOSTNAME:443 HTTP/1.1
Host: HOSTNAME
Proxy-Connection: keep-alive
User-Agent: MY_AGENT

ENCRYPTED HTTPS

我相信这些请求是 HTTP,但为什么 express 没有收到它们?

如果我将浏览器代理设置更改为忽略 HTTPS,该应用程序运行良好。但我确实想知道是否有任何解决方法可以用来代理所有使用 HTTP 和只有一个端口的协议。

谢谢。

更新 - 我的 express 应用中的代码

app.use('*', function (req, res, next) {
    // print all the request the app receive
    console.log('received:', req.url)
})

app.use(bodyParser.text({type: '*/*'}))
app.use(cookieParser())
app.use(logger('dev'))
app.use(express.static(path.join(__dirname, 'public')))

// serve web pages for my app, only the request targeting my server
// is handled here(right IP and port), proxy request gets handled after this.
app.use('/', internalRoute)

// analyse the part I want
app.use('/END_POINT_I_WANT', myRoute)

// handle proxy requests
app.use('*', function (req, res, next) {
  // proxy the request here
})

问题是,我的第一个中间件,用于显示应用程序接收到的所有请求,无法捕获上面描述的用 HTTP 包装的 HTTPS 代理请求。当然,我用作代理的中间件也无法捕获它们。

更新尝试node-http-prxoy,没有运气

var httpProxy = require('http-proxy')
  , http = require('http')
  , fs = require('fs')

var options = {target: 'http://127.0.0.1:8099'}
  , proxy = httpProxy.createServer(options)

http.createServer(function (req, res) {
  console.log(req.url)
  proxy.web(req, res)
}).listen(5050)

使用上面的代码,以及使用 HTTP 代理所有协议的浏览器设置,它的工作方式与我的 express 应用程序相同。 HTTPS 代理请求得到ERR_EMPTY_RESPONSE,控制台上什么也没有。

使用以下选项,我似乎必须将代理协议更改为 HTTPS,我宁愿不使用它,至少现在是这样。我的自签名证书得到ERR_PROXY_CERTIFICATE_INVALID...

var options  = { secure: true
               , target: 'http://127.0.0.1:8099'
               , ssl: { key: fs.readFileSync('cert/key.pem', 'utf8')
                      , cert: fs.readFileSync('cert/server.crt', 'utf8')
                      }
               }

更新 - 将问题定位到“连接”事件侦听器

通过一些搜索,我发现this post 很有帮助。

它指出http服务器没有connect事件的监听器。我尝试了帖子中的代码,有效。但正如该帖子的最后一条评论所提到的,我的应用程序充当代理以获取数据,然后将请求代理到另一个代理以通过 GreatFireWall。

流程如下:BROWSER -> MY_APP -> ANOTHER_PROXY -> TARGET

没有ANOTHER_PROXY,它是一个HTTP 代理,它适用于HTTP 和HTTPS。但是我没能把它们全部锁起来。我使用的ANOTHER_PROXY 支持 HTTPS over HTTP。

【问题讨论】:

  • 我不熟悉,但也许express没有实现那部分?

标签: node.js http express https proxy


【解决方案1】:

很难看出哪里出了问题,因为您还没有发布任何代码。

但是,如果你只是想创建一个支持 HTTP 和 HTTPS 的简单代理,我认为你应该考虑使用像 node-http-proxy 这样的模块。

他们的自述文件包含最常见场景的示例代码,听起来它可以很好地支持您的需求。

【讨论】:

  • 谢谢,我试过 node-http-proxy,但问题还是一样。我将更新我在问题中使用的代码,以限制评论的长度。
猜你喜欢
  • 2012-10-22
  • 2019-07-17
  • 2013-05-27
  • 2016-02-02
  • 2018-08-18
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多