go auth_error ai_generated true

rpc error: code = Unavailable desc = 连接错误:传输:认证握手失败:tls: 第一条记录看起来不像 TLS 握手

rpc error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: tls: first record does not look like a TLS handshake"

ID: go/grpc-permission-denied-tls-mismatch

其他格式: JSON · Markdown 中文 · English
80%修复率
88%置信度
0证据数
2024-11-05首次发现

版本兼容性

版本状态引入弃用备注
1.40+ active — — —

根因分析

客户端尝试使用 TLS,但服务端提供明文(或反之)。常见于将 grpc.WithInsecure() 与 TLS 服务端混用,或使用凭证拨号明文端口时。

English

The client is attempting TLS but the server is serving plaintext (or vice versa). Common when mixing grpc.WithInsecure() with a TLS server or dialing a plaintext port with credentials.

generic

解决方案

  1. 93% 成功率
    // TLS server
    creds, _ := credentials.NewServerTLSFromFile("server.crt", "server.key")
    s := grpc.NewServer(grpc.Creds(creds))
    // TLS client
    creds, _ := credentials.NewClientTLSFromFile("ca.crt", "")
    conn, _ := grpc.Dial(addr, grpc.WithTransportCredentials(creds))
  2. 90% 成功率
    import "google.golang.org/grpc/credentials/insecure"
    conn, _ := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))

无效尝试

常见但无效的做法:

  1. 80% 失败

    Silences TLS but breaks against a TLS-only server; also disables security in production

  2. 85% 失败

    Does not help when the server isn't speaking TLS at all; and it weakens security