【问题标题】:How to set TLS/SNI option in gRPC client of Python/C++?如何在 Python/C++ 的 gRPC 客户端中设置 TLS/SNI 选项?
【发布时间】: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=allGRPC_VERBOSITY=debug 运行以获取有关连接失败的更多详细信息,例如 GRPC_TRACE=all GRPC_VERBOSITY=debug python client.py

标签: ssl grpc sni


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 2011-02-17
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2017-11-12
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多