gpt4 book ai didi

node.js - 在 Node.js Express 中使用 HTTP 代理 HTTPS

转载 作者:可可西里 更新时间:2023-11-01 16:42:05 26 4
gpt4 key购买 nike

我写了一个 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 的协议(protocol)并且只有一个端口。

谢谢。

UPDATE- 来 self 的 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 代理所有协议(protocol)的浏览器设置,它的工作方式与我的 express 应用程序相同。 HTTPS 代理请求收到 ERR_EMPTY_RESPONSE,但控制台上没有任何内容。

使用以下选项,似乎我必须将代理协议(protocol)更改为 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

如果没有作为 HTTP 代理的 ANOTHER_PROXY,它可以很好地用于 HTTP 和 HTTPS。但是我没能把它们全部链接起来。我使用的 ANOTHER_PROXY 支持 HTTPS over HTTP。

最佳答案

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

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

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

关于node.js - 在 Node.js Express 中使用 HTTP 代理 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30186599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com