我想为我信任但缺少证书的源创建grpc通道。 使用默认凭据设置安全通道失败:
import gprc
ssh_channel = grpc.secure_channel(<gprc url>, grpc.ssl_channel_credentials())
grpc.channel_ready_future(ssh_channel).result()
结果:
E1017 10:05:15.783011100 11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
E1017 10:05:16.846366639 11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
E1017 10:05:18.688887874 11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
E1017 10:05:21.557399186 11539 ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
我知道这是可能的,因为在Java中,可以执行以下操作:
import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NettyChannelBuilder;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
...
sslContext = GrpcSslContexts.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
channel = NettyChannelBuilder.forAddress(<gprc url>, 443).sslContext(sslContext).build();
但是我还没有找到类似的Python方法。
grpc.secure_channel
的文档中还描述了一个option
参数,根据该文档,它是:
用于配置通道的键/值对(gRPC Core运行时中的通道args)的可选列表。
对通道args here的引用也没有提供任何帮助。有什么想法吗?
更新:(2014年1月19日):
有一个开放的拉取请求,用于在Python代码中添加此选项,但是现在似乎已经停留在PR中几个月了:https://github.com/grpc/grpc/pull/12656
答案 0 :(得分:0)
您可能必须在单独的步骤中从站点中获取证书。如果可以一次性使用,只需使用浏览器并将证书保存在方便的地方。否则,请参见How can I retrieve the TLS/SSL peer certificate of a remote host using python?。
在我的情况下,我使用浏览器保存了证书,并执行了以下操作(我需要用证书中的目标名称覆盖目标名称,因为它是自签名的,域名不匹配):
with open(cert_path, 'rb') as f:
cert_bytes = f.read()
credentials = grpc.ssl_channel_credentials(cert_bytes)
# Deal with cert being self-signed:
cert_cn = "cn.from.cert.com" # or parse it out of the cert data
options = (('grpc.ssl_target_name_override', cert_cn,),)
channnel = grpc.secure_channel(target, credentials, options)