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

标签 go ssl grpc wireshark

我在 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 数据包
wireshark screenshot
而我希望类似于以下内容的内容清楚地显示了一些 TLS 事件(不是我的应用程序,图片来自网络用于说明目的)enter image description here
我在 Ubuntu 16.04 上运行 Wireshark v2.6.10。源 IP 和目标 IP 与我的 gRPC 客户端和服务器 IP 匹配(两者都是同一 docker 网络上的 docker 容器)。
并不是说它真的很重要,但是从我的客户端代码中可以看出,我在客户端上共享一个根 CA 证书(自签名)。我可以这样做,因为我同时部署了客户端和服务器。

最佳答案

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

关于go - 如何确认来自 Go 客户端的 gRPC 流量是 TLS 加密的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63947298/

相关文章:

apache - mod_auth_basic在https下是明文传输的吗?

kubernetes - Linkerd 以意想不到的方式对 gRPC 服务进行负载均衡

go - 有没有一种方法可以在一个 goroutine 返回后延迟一段时间后取消上下文?

戈兰 : "compress/flate" module can't decompress valid deflate compressed HTTP body

php - 在 PHP 中从 HTTP 切换到 HTTPS 时 session 丢失

java - 是否可以检查 proto 文件中的枚举值?

node.js - 动态和静态生成的grpc代码有什么区别?

assembly - 使用golang汇编语言下划线实现golang方法

go - 读取csv文件时如何跳过第一行?

Python SSL 和 Unicode 域