如何在Python / C ++ gRPC客户端API中设置TLS / SNI(https://en.wikipedia.org/wiki/Server_Name_Indication)?
换句话说,在-servername
中设置openssl s_client
相当于什么?
我已通过使用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
,这也不起作用。
答案 0 :(得分:1)
设置options=(('grpc.ssl_target_name_override', hostname),)
应该可以。这是覆盖主机名的正确方法。在这种情况下,似乎没有必要,因为您的uri主机和替代主机是相同的。您可以通过使用here中列出的环境变量来打开一些跟踪,并查看握手是否失败或是否有其他导致连接失败的原因。