登录
首页 >  Golang >  Go问答

检测 Go 客户端发送的 gRPC 流量是否已启用 TLS 加密

来源:stackoverflow

时间:2024-03-10 17:36:24 471浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《检测 Go 客户端发送的 gRPC 流量是否已启用 TLS 加密》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我用 go 编写了一个示例 grpc 客户端和服务器,两者都配置为服务器验证的 tls。

客户端 grpc 调用成功,给我的印象是 tls 配置正确,否则如果 tls 握手失败,我预计客户端会失败并且不会发出 grpc 请求(即不默认为明文)。 p>

然而,当我将 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 证书(自签名)。我可以做到这一点,因为我同时部署了客户端和服务器。


解决方案


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

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

好了,本文到此结束,带大家了解了《检测 Go 客户端发送的 gRPC 流量是否已启用 TLS 加密》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>