【问题标题】:Python secure channel gRPC 'ssl_transport_security.cc:1807] No match found for server name' on remote instancePython 安全通道 gRPC 'ssl_transport_security.cc:1807] 在远程实例上找不到服务器名称的匹配项
【发布时间】:2021-01-31 22:28:11
【问题描述】:

我有一个 Debian GCP 实例,我正在尝试运行 Python gRPC 服务器。我的实例有一个静态 IP,我正在尝试在我的远程实例(服务器)和本地客户端之间建立一个安全通道。

我在服务器上生成了自签名的 OpenSSL 证书,并且在客户端上使用了相同的证书。生成我用过的:

openssl req -newkey rsa:2048 -nodes -keyout ML.key -x509 -days 365 -out ML.crt

我的服务器是这样设置的(.key 和 .crt 文件加载了 open'rb'):

server_credentials = grpc.ssl_server_credentials(((private_key, certificate_chain,),))
self.server.add_secure_port('0.0.0.0:%d' % self.port, server_credentials)
self.server.start()

我的客户设置为:

    host = '78.673.121.16' #this is the instance's static IP
    port = 9063

    certificate_chain = __load_ssl_certificate() #this loads the certificate file

    # create credentials
    credentials = grpc.ssl_channel_credentials(root_certificates=certificate_chain)

    # create channel using ssl credentials
    channel = grpc.secure_channel('{}:{}'.format(host, port), credentials)

然后我继续提出请求。

响应我的请求,在服务器上我遇到了以下错误:

E1017 17:21:22.964227087    1881 ssl_transport_security.cc:1807] No match found for server name: 78.673.121.16.

我已尝试将证书的通用名称 (CN) 更改为 localhost0.0.0.078.673.121.16,但无济于事。

有什么建议吗?

【问题讨论】:

    标签: ssl openssl ssl-certificate grpc grpc-python


    【解决方案1】:

    尝试在secure_channel函数调用中传递这些选项

    options = {
        'grpc.ssl_target_name_override' : 'localhost',
        'grpc.default_authority': 'localhost'
    }
    channel = grpc.secure_channel('{}:{}'.format(host, port), credentials, options)
    

    【讨论】:

    • 据我所知,这会通过手动覆盖 SSL 请求的通用名称引入安全问题。我不愿意像这样妥协我的应用程序。
    【解决方案2】:

    我找不到解决此问题的方法,而是选择为我的实例设置永久 DNS。我正在使用 GCP,截至撰写本文时,它并没有直接提供将其分配给实例的方法。

    我切换到 Azure,将 DNS 分配给我的实例,并在我的自签名 SSL 证书上使用了该 DNS 和 CN

    之后我将客户端(服务器保持原样)更改为:

        host = 'myinstance.westus.azure.com' #this is the instance's DNS
        port = 9063
    

    这解决了我的问题。

    【讨论】:

      【解决方案3】:

      我刚刚遇到了类似的问题,最后终于解决了。就我而言,我将服务器托管在具有静态 ip 和端口的 kubernetes 集群中。该解决方案的关键组件是(在服务器证书中):

      1. 使用静态 IP 地址作为公用名
      2. 在证书的 SubjectAlternativeName 扩展中添加静态 IP 地址作为 DNSName

      第 2 步非常关键。在 python(使用 grpc 版本 1.34.0)中,这是通过以下方式完成的:

      from cryptography import x509
      host = '78.673.121.16'
      builder = x509.CertificateBuilder()
      ...
      builder = builder.add_extension(x509.SubjectAlternativeName([x509.DNSName(host)]), critical=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 2023-02-14
        • 2018-03-08
        • 2016-11-08
        • 2020-05-05
        • 1970-01-01
        相关资源
        最近更新 更多