为了账号安全,请及时绑定邮箱和手机立即绑定

如何确认来自 Go 客户端的 gRPC 流量是 TLS 加密的

如何确认来自 Go 客户端的 gRPC 流量是 TLS 加密的

Go
BIG阳 2022-06-27 17:28:09
我在 Go 中编写了一个示例 gRPC 客户端和服务器,两者都配置为服务器身份验证的 TLS。客户端 gRPC 调用成功,给我的印象是 TLS 配置正确,否则如果 TLS 握手失败,我希望客户端失败并且不发出 gRPC 请求(即不默认为明文)。然而,当我将 Wireshark 连接到该网络以嗅探 TCP 数据包时,我得到的结果让我感到困惑。我没有看到任何带有 TLS 的数据包,例如我没有看到 TLS CLIENT HELLO 数据包。这是因为我误解了我在 Wireshark 中看到的内容,还是我的 gRPC 客户端实际上在执行纯文本 gRPC?客户端代码如下所示,请注意grpc.withTransportCredentials我认为这意味着它将使用 TLS 或失败,但绝不是纯文本:    // block the dial until connection is successful or 3 sec timeout    dialOptions := []grpc.DialOption{        grpc.WithBlock(),        grpc.WithTimeout(3 * time.Second),    }    // Load TLS Configuration    tlsCredentials, err := LoadTLSCredentials()    if err != nil {        log.Fatalf("Failed to load TLS credentials: %v", err)    }    dialOptions = append(dialOptions, grpc.WithTransportCredentials(tlsCredentials))    // Dial the gRPC server    log.Printf("Dialing %v", *address)    conn, err := grpc.Dial(*address, dialOptions...)    if err != nil {        log.Fatalf("Failed to connect to the server: %v", err)    }    defer conn.Close()    // then this application sets up a gRPC request, and logs the response to stdout,    // in my testing stdout shows the expected gRPC response, so I'd assume TLS is working.func LoadTLSCredentials() (credentials.TransportCredentials, error) {    rootCA, err := ioutil.ReadFile("ca.cert")    if err != nil {        return nil, err    }    certPool := x509.NewCertPool()    if !certPool.AppendCertsFromPEM(rootCA) {        return nil, fmt.Errorf("Failed to add rootCA to x509 certificate pool")    }    config := &tls.Config{        MinVersion: tls.VersionTLS12,        RootCAs: certPool,    }    return credentials.NewTLS(config), nil}这是 Wireshark 的屏幕截图,没有显示 TLS 数据包而我希望类似于以下内容,清楚地显示一些 TLS 活动(不是我的应用程序,图片来自网络,用于说明目的)我在 Ubuntu 16.04 上运行 Wireshark v2.6.10。源 IP 和目标 IP 与我的 gRPC 客户端和服务器 IP 匹配(两者都是同一 docker 网络上的 docker 容器)。并不是说它真的很重要,但是从我的客户端代码中可以看出,我在客户端上共享一个根 CA 证书(自签名)。我可以这样做,因为我同时部署了客户端和服务器。
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您应该右键单击数据包列表,然后选择“解码为..”菜单项,然后选择“tls”以强制wireshark将此tcp端口中的流量解析为TLS。



查看完整回答
反对 回复 2022-06-27
?
莫回无

TA贡献1865条经验 获得超7个赞

正如@steffanUllrich 在评论中解释的那样,这是一个可以更好地配置 Wireshark 以显示 TLS 的案例。我确认 gRPC 交换确实受 TLS 保护。



查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信