在Node.js express中使用HTTP代理HTTPS

xtupzzrd  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(148)

我写了一个Express应用程序作为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和仅一个端口来代理所有协议。
谢谢

UPDATE-来自我的express app的代码

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

问题是,我的第一个中间件,用于显示应用程序接收的所有请求,不能捕获上面描述的 Package 在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')
                      }
               }

UPDATE-将问题指向'connect'事件侦听器

通过一些搜索,我发现this post很有用。
它指出http服务器没有connect事件的侦听器。我试着在邮件中的代码,作品.但正如那篇文章的最后一条评论所提到的,我的应用程序充当代理以获取数据,然后将请求代理到另一个代理以越过GreatFireWall。
这个过程就像:BROWSER -> MY_APP -> ANOTHER_PROXY -> TARGET
如果没有ANOTHER_PROXY,它是一个HTTP代理,它可以很好地工作于HTTP和HTTPS。但我没能把它们都锁起来。我使用的ANOTHER_PROXY支持HTTPS over HTTP。

ogsagwnx

ogsagwnx1#

由于您没有发布任何代码,因此很难看出可能有什么问题。
但是,如果你只是想创建一个简单的代理,支持HTTP和HTTPS,我认为你应该考虑使用像node-http-proxy这样的模块。
他们的自述文件有最常见场景的示例代码,听起来它会很好地支持您的需求。

相关问题