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

时间:2018-09-21 00:58:12

标签: ssl grpc sni

如何在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,这也不起作用。

1 个答案:

答案 0 :(得分:1)

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