【发布时间】:2022-11-11 04:19:06
【问题描述】:
我正在尝试使用 Golang 制作 https 代理。我一开始就知道,浏览器将带有结尾的标头发送到\r\n 和套接字块read(),直到读取这些字符。但是当它被加密(ssl/tls)和 HTTP 1.1(保持连接活跃)
- 浏览器如何知道读取数据结束?
- 他们是否逐字节读取并在末尾读取一些特殊字符(这对于大数据来说是不是一个好方法?)?
- 或者他们先发送数据大小(如 tcp 套接字主题中所建议的那样)?
- 作为代理,当流式传输或加载简单的 html 页面时,如何理解数据结束?
这只是代码的一部分,当我在本地网络中运行它时它可以工作,但在服务器(vps)中会阻止读取,直到连接关闭。完整代码here
func write(client_to_proxy net.Conn, browser_to_client net.Conn) {
defer client_to_proxy.Close()
buffer := make([]byte, 1024)
reader := bufio.NewReader(browser_to_client)
for {
length, err := reader.Read(buffer)
if length > 0 {
fmt.Println(time.Now().Format(time.Stamp) + " READ from client to browser: " + strconv.Itoa(length))
//fmt.Println(string(buffer[:readLeng]))
writeLength, err := client_to_proxy.Write(buffer[:length])
if writeLength > 0 {
fmt.Println(time.Now().Format(time.Stamp) + " WRITE from client to browser: " + strconv.Itoa(writeLength))
}
if err != nil {
fmt.Println("ERR6 ", err)
return
}
}
if err != nil {
fmt.Println("ERR5 ", err)
return
}
}
}
func read(client_to_proxy net.Conn, browser_to_client net.Conn) {
defer browser_to_client.Close()
buffer := make([]byte, 1024)
reader := bufio.NewReader(client_to_proxy)
length, err := reader.Read(buffer)
fmt.Println(time.Now().Format(time.Stamp) + " READ from proxy to client: " + strconv.Itoa(length))
fmt.Println(string(buffer))
if length > 0 {
writeLength, err := browser_to_client.Write(buffer[:length])
fmt.Println(time.Now().Format(time.Stamp) + " WRITE from client to browser: " + strconv.Itoa(writeLength))
if err != nil {
fmt.Println("ERR7 ", err)
return
}
}
if err != nil {
return
}
go write(client_to_proxy, browser_to_client)
for {
length, err := reader.Read(buffer)
fmt.Println(time.Now().Format(time.Stamp) + " READ from proxy to client: " + strconv.Itoa(length))
//fmt.Println(string(buffer[:length]))
if length > 0 {
writeLength, err := browser_to_client.Write(buffer[:length])
fmt.Println(time.Now().Format(time.Stamp) + " WRITE from client to browser: " + strconv.Itoa(writeLength))
if err != nil {
fmt.Println("ERR8 ", err)
return
}
}
if err != nil {
return
}
}
}
编辑1:我使用客户端和服务器 go 应用程序,例如浏览器->客户端->代理->so.com 然后 so.com->prxoy->客户端->浏览器
我不想要加密数据!我的问题出在“客户端”应用程序上,我不知道应该读取多少字节才能解锁read()!
【问题讨论】:
-
您似乎对 HTTPS 的工作原理有误解。 HTTPS 不仅仅是加密的 HTTP 请求和响应。这是一个加密连接,通过它发送标准 HTTP 请求和响应。
-
@Flimzy 我知道 https 是什么,我不想解密连接,我只是想知道数据的结尾来解锁 read() 并将其发送到浏览器。我添加了我完整的 github 代码
-
关键是,您无法在 TLS 级别知道这一点。
-
@forootan 代理只是一个传递。浏览器告诉代理要连接到哪个服务器,然后代理传递浏览器发送的任何数据,反之亦然,服务器发送回的任何数据。如果数据使用 TLS 加密,则代理无法知道数据中的内容,因为只有浏览器和服务器才能解密它。代理所能做的就是来回传递原始字节,直到 TCP 连接关闭。不多也不少。
标签: go sockets https tcp proxy