如何在 Python/C++ 的 gRPC 客户端中设置 TLS/SNI 选项?

ste*_*ang 6 ssl sni grpc

如何在 Python/C++ gRPC 客户端 API 中设置 TLS/SNI ( https://en.wikipedia.org/wiki/Server_Name_Indication )?

换句话说,什么等同于设置-servernamein openssl s_client

我已经通过在以下位置使用正确的标志来验证我的 TLS 服务器是否正常工作openssl s_client

 openssl s_client -connect "myserver.tunnel.dev:4443" -servername "myserver.tunnel.dev" 
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用 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),)
)
Run Code Online (Sandbox Code Playgroud)

这抛出:

grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, Connect Failed)>
Run Code Online (Sandbox Code Playgroud)

ChannelOptions结构中,我能找到的最接近的选项是ssl_target_name_override,它也不起作用。

小智 4

设置options=(('grpc.ssl_target_name_override', hostname),)应该有效。这是覆盖主机名的正确方法。在这种情况下,似乎没有必要,因为您的 uri 主机和覆盖主机是相同的。您可以使用此处列出的环境变量打开一些跟踪,并查看握手是否失败或者是否有其他原因导致连接失败。