Golang读取HTTPS响应体
我正在编写一些中间件,我需要能够记录响应主体内容,即使目标使用TLS加密 我有一个处理程序链,在其中我将响应体存储在一个中间缓冲区中,这样我就可以多次读取它。这是基于icza()提供的优秀示例 在我的handler func中,我正在这样做Golang读取HTTPS响应体,go,middleware,Go,Middleware,我正在编写一些中间件,我需要能够记录响应主体内容,即使目标使用TLS加密 我有一个处理程序链,在其中我将响应体存储在一个中间缓冲区中,这样我就可以多次读取它。这是基于icza()提供的优秀示例 在我的handler func中,我正在这样做 body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } // Print the response body to st
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
// Print the response body to stdout
fmt.Printf("Dest HTTP response body: %s\n", body)
bRdr := bytes.NewReader(body)
n, err := io.Copy(w, bRdr) // Copy the entire response body into our outgoing response
我发现,当连接到一个不使用TLS的目的地时,我会得到可读的输出,但当连接到使用TLS的目的地时,响应主体似乎仍然是加密的,尽管复制到发送人的最终响应中会导致发送人接收到有效的响应主体内容
这是具有加密路径的响应体读取的预期行为吗?
我可以解密这些数据使其可读吗?我已经阅读了http、tls和crypto软件包文档,但没有找到任何线索。我不确定是否理解这个问题,但我正在调用https google链接并打印输出
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"golang.org/x/net/http2"
)
func main() {
client := &http.Client{Transport: transport2()}
res, err := client.Get("https://www.google.com")
if err != nil {
log.Fatal(err)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
res.Body.Close()
fmt.Printf("Code: %d\n", res.StatusCode)
fmt.Printf("Body: %s\n", body)
}
func transport2() *http2.Transport {
return &http2.Transport{
DisableCompression: true,
AllowHTTP: false,
}
}
谢谢大家的评论。特拉维斯似乎已经发现了我的问题。我正在阅读的响应主体似乎是gzip编码的(响应包含“Content Encoding:gzip”)。为了验证情况是否属实,我必须在转发之前明确删除原始请求中的“Accept Encoding:gzip”头,并将传输配置为设置“DisableCompression:true”。一旦我做了这两个更改,我就会看到没有“内容编码”标题的响应,我读的正文是人类可读的。TLS在一个完全不同的层上运行。读取主体时,您没有查看TLS流。TLS加密/解密在此层是透明的。您确定正在查看加密的正文或一些垃圾数据吗?是否可能正在查看压缩的正文?谢谢大家的评论。特拉维斯似乎已经发现了我的问题。我正在阅读的响应主体似乎是gzip编码的(响应包含“Content Encoding:gzip”)。为了验证情况是否属实,我必须在转发之前明确删除原始请求中的“Accept Encoding:gzip”头,并将传输配置为设置“DisableCompression:true”。一旦我做了这两个更改,我就会看到没有“内容编码”标题的响应,并且我读的主体是可读的。现在我需要做的就是重新打开gzip编码,并找出如何解压缩gzip响应主体。我知道还有很多关于这个话题的帖子,所以我会研究这些。