簡體   English   中英

如何確認來自 Go 客戶端的 gRPC 流量是 TLS 加密的

[英]How to confirm gRPC traffic from Go client is TLS encrypted

我在 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 數據包線鯊截圖 而我希望類似於以下內容的內容清楚地顯示一些 TLS 活動(不是我的應用程序,圖像來自網絡以供說明) 在此處輸入圖片說明

我在 Ubuntu 16.04 上運行 Wireshark v2.6.10。 源 IP 和目標 IP 匹配我的 gRPC 客戶端和服務器 IP(兩者都是同一 docker 網絡上的 docker 容器)。

這並不重要,但從我的客戶端代碼中可以看出,我在客戶端上共享根 CA 證書(自簽名)。 我可以這樣做,因為我同時部署了客戶端和服務器。

正如@steffanUllrich 在評論中解釋的那樣,這是一個可以更好地配置 Wireshark 以顯示 TLS 的案例。 我確認 gRPC 交換確實受 TLS 保護。

您應該右鍵單擊數據包列表,然后選擇“解碼為...”菜單項,然后選擇“tls”以強制wireshark將此tcp端口中的流量解析為TLS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM