【发布时间】:2022-08-08 18:27:31
【问题描述】:
我有一个具有有效 TLS 证书且不需要客户端 TLS 的 grpc 服务器(在 Go 中)。出于某种原因,我无法在 Python 中实现没有 mTLS 的客户端,即使我可以在 Golang 中这样做。
在Python中我有
os.environ[\"GRPC_VERBOSITY\"] = \"DEBUG\"
# os.environ[\"GRPC_DEFAULT_SSL_ROOTS_FILE_PATH\"] = \"/etc/ssl/certs/ca-bundle.crt\"
channel = grpc.secure_channel(ADDR, grpc.ssl_channel_credentials())
grpc.channel_ready_future(channel).result(timeout=10)
这给了我以下错误
D0513 08:02:08.147319164 21092 security_handshaker.cc:181] Security handshake failed: {\"created\":\"@1652446928.147311309\",\"description\":\"Handshake failed\",\"file\":\"src/core/lib/security/transport/security_handshaker.cc\",\"file_line\":377,\"tsi_code\":10,\"tsi_error\":\"TSI_PROTOCOL_FAILURE\"}
如果我通过取消注释掉注释行来使用 SSL 证书,我可以让它工作。我知道我的服务器不会请求、要求或验证客户端证书,因为以下 Go 代码完美运行
conn, err := grpc.DialContext(
ctx,
gRPCAddr,
grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, \"\")),
)
dummyClient := dummy.NewDummyServiceClient(conn)
if _, err := dummyClient.Ping(context.Background(), &dummy.PingRequest{
Ping: \"go client ping\",
}); err != nil {
return fmt.Errorf(\"failed to ping: %w\", err)
}
-
是否有可能其中一个中间 CA 无效?您应该能够使用 openssl 的 s_client 对其进行测试,并尝试连接到服务器 ip/port。
-
@CarlMastrangelo 一开始我也是这么想的,但是中间 CA 肯定是有效的,因为 go 客户端能够使用传输凭据连接到服务器(使通道成为安全通道)?
-
如果我的记忆服务于 Go 客户端处理 TLS 的方式(纯 Go 重新实现)与 BoringSSL/OpenSSL 库(由 Python 和包装语言使用)不同。 TLS 库的差异可能是验证存在差异的原因。因此,使用 openssl s_client 检查肯定会显示出来。
标签: python ssl grpc grpc-python grpc-go