go
auth_error
ai_generated
true
rpc 错误: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
80%修复率
87%置信度
0证据数
2024-07-03首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| google.golang.org/grpc 1.x | active | — | — | — |
根因分析
客户端尝试对明文 gRPC 服务端使用 TLS,或反之。通常发生在客户端使用 credentials.NewTLS 但服务端未启用 TLS 凭据启动时。
English
The client tried to use TLS against a plaintext gRPC server, or vice versa. Typically happens when the client uses credentials.NewTLS but the server was started without TLS credentials.
解决方案
-
92% 成功率
// server creds, _ := credentials.NewServerTLSFromFile("server.crt", "server.key") s := grpc.NewServer(grpc.Creds(creds)) // client creds, _ := credentials.NewClientTLSFromFile("ca.crt", "") conn, _ := grpc.Dial(addr, grpc.WithTransportCredentials(creds)) -
85% 成功率
if os.Getenv("ENV") == "local" { conn, _ = grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) } else { conn, _ = grpc.Dial(addr, grpc.WithTransportCredentials(creds)) }
无效尝试
常见但无效的做法:
-
95% 失败
The handshake fails before certificate verification; the server is not speaking TLS at all.
-
90% 失败
The handshake fails immediately due to protocol mismatch, not latency.