我用Go编写了一个样例gRPC客户端和服务器,两者都配置为服务器认证的TLS。
客户端gRPC调用成功,给我的印象是TLS配置正确,否则,如果TLS握手失败,我预计客户端将失败,并且不会发出gRPC请求(即,不默认为明文)。
然而,当我将Wireshark连接到该网络以嗅探TCP数据包时,却得到了一个结果,这让我感到困惑。我看不到任何带有TLS的数据包,例如,我看不到TLS客户端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与我的gRPC客户端和服务器IP匹配(两者都是同一码头网络上的码头容器)。
这并不重要,但从我的客户机代码中可以看出,我在客户机上共享一个根CA证书(自签名)。我之所以能这样做,是因为我同时部署了客户端和服务器。
发布于 2020-09-19 14:58:09
正如@steffanUllrich在评论中解释的那样,这是Wireshark可以更好地配置为显示TLS的一个例子。我确认了gRPC交换确实是受TLS保护的。
发布于 2020-12-03 20:32:19
你应该右击数据包列表,然后选择“解码为..”。菜单项,然后选择“TLS”以强制wireshark将此tcp端口中的通信量解析为TLS。
https://stackoverflow.com/questions/63947298
复制相似问题