Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用仅支持TLS 1.0的主机处理Python请求_Python 3.x_Ssl_Openssl - Fatal编程技术网

Python 3.x 如何使用仅支持TLS 1.0的主机处理Python请求

Python 3.x 如何使用仅支持TLS 1.0的主机处理Python请求,python-3.x,ssl,openssl,Python 3.x,Ssl,Openssl,使用OPENSSL_VERSION:OPENSSL 1.1.0j并尝试连接到似乎只支持TLS 1.0密码的主机,并在_sslobj.do_handshake()中出错 从您试图访问的服务器上可以看到,服务器严重损坏。它的等级为F(最差),这主要是因为它的密码非常不安全: 唯一不可怕的不安全但唯一弱的密码使用3DES。由于这个弱点,这个密码可能没有包含在您平台上的openssl构建中(例如,Debian和基于Debian的系统,如Ubuntu,没有包含这个密码) 这意味着从Python脚本访问服

使用OPENSSL_VERSION:OPENSSL 1.1.0j并尝试连接到似乎只支持TLS 1.0密码的主机,并在_sslobj.do_handshake()中出错

从您试图访问的服务器上可以看到,服务器严重损坏。它的等级为F(最差),这主要是因为它的密码非常不安全:

唯一不可怕的不安全但唯一弱的密码使用3DES。由于这个弱点,这个密码可能没有包含在您平台上的openssl构建中(例如,Debian和基于Debian的系统,如Ubuntu,没有包含这个密码)

这意味着从Python脚本访问服务器的唯一方法是使用链接到旧版本OpenSSL或链接到现代版本但明确包含此密码的Python版本。即使这样,您也可能需要专门启用3DES,因为urllib暂时禁用了3DES。因此,当使用包含3DES支持的OpenSSL构建Python时,应该可以使用以下功能:

import ssl
from urllib.request import urlopen

url = 'https://slpin.universalservice.org/'
ctx = ssl.create_default_context()
ctx.set_ciphers('3DES')
urlopen(url, context = ctx).read()

在我的例子中,这给出了一个
403禁止
,它与我使用浏览器访问此URL时得到的匹配。

感谢您的回复。我看到主机配置不好,只支持不安全的密码。当我尝试按您的方式运行时,得到的不是403禁止的错误,而是ssl.SSLError:(“无法选择密码”。,)。你能用url=''试试吗?这样你就可以返回一个HTML页面了。@MchaelTocho:对,这给了我HTML。但重复一次:实际上有两个问题。首先,OpenSSL的较新版本不支持3DES内置,这意味着它也无法启用。相反,您需要一个针对OpenSSL库的Python构建,该库支持3DES。只有这样,第二个问题才相关:默认情况下,urllib启用了3DES。这是由我包含的代码修复的。但是,如果底层OpenSSL库不支持3DE,代码将无法神奇地使3DE可用(即第一个问题)。@MchaelTocho:“ssl.SSLError:(‘无法选择密码’,)”意味着与Python链接的OpenSSL不支持3DE。在这种情况下,脚本将没有帮助。该脚本只能启用已禁用的内容,它无法神奇地使3DES支持在未在中编译时发生。Steffen,您是否知道是否有办法安装仍然支持3DES的较旧版本的OpenSSL?或者,是否有一个不同的库来代替使用我们正在处理的主机接受的密码建立SSL握手?urllib不需要更改;它保留了libssl默认密码列表,该列表在OpenSSL 1.1.0中更改为排除所有64位(1DES、3DES、IDEA)(尽管一些?/许多?版本已经排除了IDEA,因为它不是免费的),还有RC4种子茶花AESCCM和DSS(!)@MchaelTocho:最坏的情况是,如果您无法让请求/urllib正常工作,请尝试运行外部curl或wget或类似工具,并从中捕获数据。
import ssl
from urllib.request import urlopen

url = 'https://slpin.universalservice.org/'
ctx = ssl.create_default_context()
ctx.set_ciphers('3DES')
urlopen(url, context = ctx).read()