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

我在 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 数据包

http://img.mukewang.com/62b978560001cbd010580462.jpg

而我希望类似于以下内容,清楚地显示一些 TLS 活动(不是我的应用程序,图片来自网络,用于说明目的)

http://img2.mukewang.com/62b97866000167f012800716.jpg

我在 Ubuntu 16.04 上运行 Wireshark v2.6.10。源 IP 和目标 IP 与我的 gRPC 客户端和服务器 IP 匹配(两者都是同一 docker 网络上的 docker 容器)。

并不是说它真的很重要,但是从我的客户端代码中可以看出,我在客户端上共享一个根 CA 证书(自签名)。我可以这样做,因为我同时部署了客户端和服务器。


BIG阳
浏览 147回答 2
2回答

森林海

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

莫回无

正如@steffanUllrich 在评论中解释的那样,这是一个可以更好地配置 Wireshark 以显示 TLS 的案例。我确认 gRPC 交换确实受 TLS 保护。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go