【问题标题】:gRPC unable to create connection to server (Go) from client (Python)gRPC 无法从客户端(Python)创建到服务器(Go)的连接
【发布时间】:2020-06-02 21:12:11
【问题描述】:

我有这个 Python 代码,它应该使用证书并通过服务器的 IP 地址(没有可用的 FQDN)连接到服务器,但每次尝试时都会出错:

ssl_transport_security.cc:222]                 LOOP - TLS client process_change_ciph  - !!!!!!
ssl_transport_security.cc:222]                 LOOP - TLS client read_server_finishe  - !!!!!!
ssl_transport_security.cc:222]                 LOOP - TLS client finish_client_hands  - !!!!!!
ssl_transport_security.cc:222]                 LOOP -                TLS client done  - !!!!!!
ssl_transport_security.cc:222]       HANDSHAKE DONE -                TLS client done  - !!!!!!
security_handshaker.cc:184] Security handshake failed: {"created":"@1582052112.923538253","description":"Peer name 172.18.0.14 is not in peer certificate","file":"src/core/lib/security/security_connector/ssl/ssl_security_connector.cc","file_line":55}
subchannel.cc:1003]         Connect failed: {"created":"@1582052112.923538253","description":"Peer name 172.18.0.14 is not in peer certificate","file":"src/core/lib/security/security_connector/ssl/ssl_security_connector.cc","file_line":55}
subchannel.cc:940]          Subchannel 0x55ad70542020: Retry immediately
subchannel.cc:967]          Failed to connect to channel, retrying

据我了解,这可能是因为我连接的是 IP 地址而不是 FQDN,但这些是服务器,我只能访问 IP 地址。知道如何克服这个问题吗?

使用的 Python 代码:

def get_secure_channel(host, port):
    if os.environ.get('https_proxy'):
        del os.environ['https_proxy']
    if os.environ.get('http_proxy'):
        del os.environ['http_proxy']

    with open(os.path.join(settings.DJANGO_ROOT, '../grpc_proto/cert/server.crt'), 'rb') as f:
        cert = f.read()

    credentials = grpc.ssl_channel_credentials(root_certificates=cert)
    return grpc.secure_channel('{}:{}'.format(host, port), credentials)

def reset_client(channel, ip_address):
    stub = dnsadblock_pb2_grpc.DnsadblockServiceStub(channel)
    return stub.ResetClient(dnsadblock_pb2.ResetClientRequest(ipAddress=ip_address))

channel = get_secure_channel(c.server.hostname, settings.GRPC_PORT)
rpc.reset_client(channel, c.ip_address)

【问题讨论】:

    标签: grpc rpc


    【解决方案1】:

    https://support.dnsimple.com/articles/what-is-common-name/

    在这种情况下,您连接的端点与对等方证书的描述不匹配。因此,连接被拒绝。您可以尝试使用证书中的 CN 之一连接到服务器。或者将端点添加到您的证书中。

    【讨论】:

      【解决方案2】:

      我正在集成一个 go grpc 服务器和一个 Python 客户端。为了让它发挥作用,我做了以下操作。

      使用此行创建 server.csr 文件时

      openssl req -new -sha256 -key certs/server.key -out certs/server.csr -config certs/certificate.conf
      

      certs/certificate.conf 看起来像这样:

      [req]
      default_bits = 4096
      prompt = no
      default_md = sha256
      req_extensions = req_ext
      distinguished_name = dn
      [dn]
      C = AU
      ST = VIC
      O = OCOM Software
      CN = hub_proxy
      [req_ext]
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = hub_proxy
      IP.1 = ::1
      IP.2 = 127.0.0.1
      

      注意 CN = hub_proxy 和 DNS.1 = hub_proxy 我不确定哪个解决了这个问题,但是当我使用这些设置重新生成证书和密钥时。

      然后使用 hub_proxy:9000(其中 9000 是端口号)的主机名(在客户端)连接到服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 2021-08-28
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多