我正在从事一个基于Grpc的项目。然而,当我试图用以下代码连接到服务时,我遇到了一个问题:
import grpc
from grpc_health.v1 import health_pb2
from grpc_health.v1 import health_pb2_grpc
with open('ca_chain_pem_path', 'rb') as f:
ca = f.read()
credentials = grpc.ssl_channel_credentials(ca)
with grpc.secure_channel('host_domain:50051', credentials) as channel:
stub = health_pb2_grpc.HealthStub(channel)
request = health_pb2.HealthCheckRequest()
response = stub.Check(request)
它会引发以下错误:Handshake failed with fatal error SSL_ERROR_SSL: error:10000410:SSL routines:OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE
和我不知道如何修复它。我的服务位于AWS中的负载均衡器后面,我可以通过grpcurl和grpcui连接到它,但不能用python连接,这是令人沮丧的。
我在谷歌寻找一个解决方案,在这个页面上没有成功。提前感谢
PD:我在代码中读取的证书是在aws域中对已部署的服务进行签名的证书
发布于 2022-10-30 22:25:45
我有同样的问题,同样的结果。我发现了这个问题- ED25519算法在TLS上的grpcioo失败
正如讨论中所建议的那样,我已经用这个环境变量重新安装了grcpio
export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
ssl错误消失了。
发布于 2022-02-09 19:29:27
如果它是一个私有证书,我认为您也应该将它指定为ssl_channel_credentials:
with open(certs_folder / "client.key", 'rb') as fh:
key = fh.read()
with open(certs_folder / "client.pem", 'rb') as fh:
cert = fh.read()
with open(certs_folder / "server.pem", 'rb') as fh:
root_ca = fh.read()
credentials = grpc.ssl_channel_credentials(root_certificates=root_ca,
private_key=key, certificate_chain=cert)
host_domain:50051与证书中的内容匹配吗?如果不是,您可能需要在options=(('grpc.ssl_target_name_override',
中使用grpc.secure_channel
https://stackoverflow.com/questions/71053456
复制相似问题