当前位置: 首页 > 知识库问答 >
问题:

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

司徒运锋
2023-03-14

我在Go中编写了一个示例gRPC客户端服务器,两者都是为服务器身份验证的TLS配置的。

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

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

这是因为我误解了我在Wireshark中看到的内容,还是我的gRPC客户端实际上在做纯文本gRPC?

客户机代码如下所示,请注意grpc。使用TransportCredentials,我认为这意味着它将使用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 v2。Ubuntu 16.04上的6.10。源和目标IP与我的gRPC客户端和服务器IP匹配(都是同一docker网络上的docker容器)。

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

共有2个答案

姚鹤龄
2023-03-14

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

郑波
2023-03-14

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

 类似资料:
  • gRPC客户端流媒体/双向流媒体是如何使用HTTP/2实现的 服务器流媒体是有意义的,因为它可以利用服务器推送来发送对请求的多个响应,但我不清楚它如何像通过websocket那样通过HTTP/2进行双向消息传递。

  • 我在一个软件应用程序上工作,该应用程序使用gRPC在客户端和服务器之间建立双向流。 我正在寻找类似于这张票的答案的东西,只在java中:如何为gRPC启用服务器端SSL? 我想配置我的应用程序,以便他们可以选择他们想要使用的TLS场景: 场景1:明文(无加密) 场景2:服务器端TLS 场景3:共同TLS 对于TLS设置,我在非Android环境中使用Java,因此我只考虑使用https://git

  • 我们的用例是提出大量请求。每个请求返回1MB的数据。现在,在客户端,我们创建一个GRPC通道,并在循环中运行以下函数 我的问题是在python中如何创建grpc客户端连接池以获得更好的吞吐量? 在golang我看到了这个https://godoc.org/google.golang.org/api/option#WithGRPCConnectionPool但是我很难在python中找到文档。 py

  • 问题内容: 下面的答案来自这个问题。 授予的答案实际上并没有解决所有问题。它仅在数据传输的上下文中提及SSL,实际上并未涵盖身份验证。 您真的在问有关安全认证REST API客户端的问题。除非您使用TLS客户端身份验证,否则单独使用SSL并不是REST API可行的身份验证机制。没有客户端身份验证的SSL仅对服务器进行身份验证,这与大多数REST API无关。 如果您不使用TLS客户端身份验证,则

  • filter.network.ClientSSLAuth TLS客户端身份认证配置概述 filter.network.ClientSSLAuth filter.network.ClientSSLAuth proto { "auth_api_cluster": "...", "stat_prefix": "...", "refresh_delay": "{...}", "ip_whi

  • TLS客户端身份认证配置参考。 { "name": "client_ssl_auth", "config": { "auth_api_cluster": "...", "stat_prefix": "...", "refresh_delay_ms": "...", "ip_white_list": [] } } auth_api_cluster (re