我在 Go 中編寫了一個示例 gRPC 客戶端和服務(wù)器,兩者都配置為服務(wù)器身份驗證的 TLS??蛻舳?gRPC 調(diào)用成功,給我的印象是 TLS 配置正確,否則如果 TLS 握手失敗,我希望客戶端失敗并且不發(fā)出 gRPC 請求(即不默認為明文)。然而,當我將 Wireshark 連接到該網(wǎng)絡(luò)以嗅探 TCP 數(shù)據(jù)包時,我得到的結(jié)果讓我感到困惑。我沒有看到任何帶有 TLS 的數(shù)據(jù)包,例如我沒有看到 TLS CLIENT HELLO 數(shù)據(jù)包。這是因為我誤解了我在 Wireshark 中看到的內(nèi)容,還是我的 gRPC 客戶端實際上在執(zhí)行純文本 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 數(shù)據(jù)包而我希望類似于以下內(nèi)容,清楚地顯示一些 TLS 活動(不是我的應(yīng)用程序,圖片來自網(wǎng)絡(luò),用于說明目的)我在 Ubuntu 16.04 上運行 Wireshark v2.6.10。源 IP 和目標 IP 與我的 gRPC 客戶端和服務(wù)器 IP 匹配(兩者都是同一 docker 網(wǎng)絡(luò)上的 docker 容器)。并不是說它真的很重要,但是從我的客戶端代碼中可以看出,我在客戶端上共享一個根 CA 證書(自簽名)。我可以這樣做,因為我同時部署了客戶端和服務(wù)器。
- 2 回答
- 0 關(guān)注
- 172 瀏覽
添加回答
舉報
0/150
提交
取消