首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确认来自Go客户端的gRPC流量是否经过TLS加密

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

Stack Overflow用户
提问于 2020-09-18 07:21:36
回答 2查看 276关注 0票数 3

我用Go编写了一个样例gRPC客户端和服务器,两者都配置为服务器认证的TLS。

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

然而,当我将Wireshark连接到该网络以嗅探TCP数据包时,却得到了一个结果,这让我感到困惑。我看不到任何带有TLS的数据包,例如,我看不到TLS客户端HELLO数据包。

那么,这是因为我曲解了我在Wireshark中看到的内容,还是我的gRPC客户端实际上在执行明文gRPC?

客户端代码如下所示,注意grpc.withTransportCredentials,我认为这意味着它将使用TLS或失败,但绝不是明文:

代码语言:javascript
运行
复制
    // 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与我的gRPC客户端和服务器IP匹配(两者都是同一码头网络上的码头容器)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-19 14:58:09

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

票数 0
EN

Stack Overflow用户

发布于 2020-12-03 20:32:19

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63947298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档