如何在 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
struct,我能找到的最接近的选项是 ssl_target_name_override
,它也不起作用。
最佳答案
设置 options=(('grpc.ssl_target_name_override', hostname),)
应该有效。这是覆盖主机名的正确方法。在这种情况下,似乎没有必要,因为您的 uri 主机和覆盖主机是相同的。您可以使用列出的环境变量打开一些跟踪 here并查看握手是否失败或连接失败是否有其他原因。
关于ssl - 如何在 Python/C++ 的 gRPC 客户端中设置 TLS/SNI 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435206/