python - 无法使用 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
- 我确定这是连接问题(密码相关)还是由于 SSL 验证的最佳方法是什么?
- 如果是由于 SSL 验证,我假设我在下面错误地应用了上下文?
** 编辑 ** 好吧,经过一番玩耍后,我可以确定这不是密码问题,因为以下代码有效:
context = ssl._create_unverified_context()
self._s = context.wrap_socket(thesocket, server_side=False,
do_handshake_on_connect=True,
server_hostname=self.tls_hostname)
由于我正在建立的连接完全在我们的网络内部,我认为这是合适的,但我想考虑安全选项。我仍然不知道为什么主机名验证会导致问题?
解决方案
推荐阅读
- c# - 在数组中存储串行读取字节
- sql - 将 varchar 转换为十进制棒球平均值
- r - Reulerr 包 - 显示错误的 euler 图
- xml - 来自 xml 输入的 Xslt 格式编号
- swift - Firebase 将 URL 上传到实时数据库
- javascript - React - 使用 Object.keys.map 迭代时检查字符串中的空格
- python - 如何根据多个条件顺序评估Dataframe中的列
- processing - 根据鼠标位置移动图像留下轨迹和方向移动 - 处理
- assembly - 在 glibc 的 ld.so 中禁用 xsave
- python - Python 'while' 有两个条件:“and”或“or”