【发布时间】:2021-08-11 22:25:18
【问题描述】:
如何在 Python/C++ gRPC 客户端 API 中设置 TLS/SNI (https://en.wikipedia.org/wiki/Server_Name_Indication)?
也就是说,在openssl s_client 中设置-servername 相当于什么?
我已通过在 openssl s_client 上使用正确的标志验证了我的 TLS 服务器工作正常:
openssl s_client -connect "myserver.tunnel.dev:4443" -servername "myserver.tunnel.dev"
但是,我无法使用 Python /C++ API 正确设置凭据:
uri = "myserver.tunnel.dev:4443"
hostname = "myserver.tunnel.dev"
creds = grpc.ssl_channel_credentials(
root_certificates=dev_cert)
# root_certificates=certificate_chain)
# certificate_chain=certificate_chain)
channel = grpc.secure_channel(uri, creds,
options=(('grpc.ssl_target_name_override', hostname),)
)
这会抛出:
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, Connect Failed)>
在ChannelOptions 结构中,我能找到的最接近的选项是ssl_target_name_override,它也不起作用。
【问题讨论】:
-
按照 srini 的回答中的建议,尝试使用
GRPC_TRACE=all和GRPC_VERBOSITY=debug运行以获取有关连接失败的更多详细信息,例如GRPC_TRACE=all GRPC_VERBOSITY=debug python client.py