首页 > 解决方案 > 无法使用 Python 2.7.18 连接到 NBD 服务器

问题描述

我正在尝试使用 python 2.7.18 连接到 NBD 服务器。我的代码在 centOS 服务器(可能是较旧的 python / ssl 库)上运行时能够连接,但自从移至 Ubuntu 20.04 后,当我尝试协商 TLS 连接时,出现以下错误:

File "/usr/lib/python2.7/ssl.py", line 369, in wrap_socket
_context=self)
File "/usr/lib/python2.7/ssl.py", line 599, in __init__
self.do_handshake()
File "/usr/lib/python2.7/ssl.py", line 828, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727) 

我看到它的方式是由于 2 个设备无法协商合适的密码或在禁止自签名证书的 python / python SSL 库中发生更改而导致我无法连接。

我已经在线阅读了一些解决方案(不幸的是,错误有点模糊),然后指出我尝试过的 ssl._create_unverified_context 分配的用法(如下面的代码所示)但这似乎不起作用,让我相信不是那样,或者我可能没有正确地将它应用到我的代码中。

我的代码(下面的“修复”目前不起作用)如下:

def _upgrade_socket_to_TLS(self):
    thesocket = self._s
    # Forcing the client to use TLSv1_2
    ssl._create_default_https_context = ssl._create_unverified_context
    context = ssl.create_default_context()
    ssl._create_default_https_context = ssl._create_unverified_context
    context.load_verify_locations(cafile=self.ca_cert)
    self._s = context.wrap_socket(thesocket, server_side=False,
                                  do_handshake_on_connect=True,
                                  server_hostname=self.tls_hostname)

我可以确认证书路径是正确的,并且在升级到 Ubuntu 20.04 之前,这个完全相同的代码(未经验证的上下文位除外)有效

值得注意的是,ubuntu 服务器正在运行 openssl 1.1.1F,而我连接的服务器正在运行 1.0.2k-fips

** 编辑 ** 好吧,经过一番玩耍后,我可以确定这不是密码问题,因为以下代码有效:

 context = ssl._create_unverified_context()
    self._s = context.wrap_socket(thesocket, server_side=False,
                                  do_handshake_on_connect=True,
                                  server_hostname=self.tls_hostname)

由于我正在建立的连接完全在我们的网络内部,我认为这是合适的,但我想考虑安全选项。我仍然不知道为什么主机名验证会导致问题?

标签: pythonpython-2.7

解决方案


推荐阅读