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
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.
解决方案
-
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)) -
90% 成功率
import "google.golang.org/grpc/credentials/insecure" conn, _ := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
无效尝试
常见但无效的做法:
-
80% 失败
Silences TLS but breaks against a TLS-only server; also disables security in production
-
85% 失败
Does not help when the server isn't speaking TLS at all; and it weakens security