Python 远程实例上的安全通道 gRPC 'ssl_transport_security.cc:1807] No match found for server name'
Python secure channel gRPC 'ssl_transport_security.cc:1807] No match found for server name' on remote instance
我有一个 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) 更改为 localhost
、0.0.0.0
和 78.673.121.16
,但无济于事。
有什么建议吗?
尝试在 secure_channel 函数调用中传递这些选项
options = {
'grpc.ssl_target_name_override' : 'localhost',
'grpc.default_authority': 'localhost'
}
channel = grpc.secure_channel('{}:{}'.format(host, port), credentials, options)
我未能找到解决此问题的方法,而是选择为我的实例设置永久 DNS。我正在使用 GCP,在撰写本文时,它并没有直接提供一种将其分配给实例的方法。
我切换到 Azure,将 DNS 分配给我的实例并在我的 self-signed SSL 证书上使用该 DNS 和 CN
。
之后我将客户端(服务器保持原样)更改为:
host = 'myinstance.westus.azure.com' #this is the instance's DNS
port = 9063
这解决了我的问题。
我也遇到了类似的问题,终于解决了。就我而言,我将服务器托管在具有静态 ip 和端口的 kubernetes 集群中。该解决方案的关键组件是(在服务器证书中):
- 使用静态 IP 地址作为公用名
- 在证书的 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)
我有一个 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) 更改为 localhost
、0.0.0.0
和 78.673.121.16
,但无济于事。
有什么建议吗?
尝试在 secure_channel 函数调用中传递这些选项
options = {
'grpc.ssl_target_name_override' : 'localhost',
'grpc.default_authority': 'localhost'
}
channel = grpc.secure_channel('{}:{}'.format(host, port), credentials, options)
我未能找到解决此问题的方法,而是选择为我的实例设置永久 DNS。我正在使用 GCP,在撰写本文时,它并没有直接提供一种将其分配给实例的方法。
我切换到 Azure,将 DNS 分配给我的实例并在我的 self-signed SSL 证书上使用该 DNS 和 CN
。
之后我将客户端(服务器保持原样)更改为:
host = 'myinstance.westus.azure.com' #this is the instance's DNS
port = 9063
这解决了我的问题。
我也遇到了类似的问题,终于解决了。就我而言,我将服务器托管在具有静态 ip 和端口的 kubernetes 集群中。该解决方案的关键组件是(在服务器证书中):
- 使用静态 IP 地址作为公用名
- 在证书的 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)