使用 OPENSSL_VERSION:OpenSSL 1.1.0j 并尝试连接到似乎仅支持 TLS 1.0 密码的主机并在 _sslobj.do_handshake() 中出现错误。
import OpenSSL
import requests
from urllib.request import urlopen
import ssl
...
url = 'https://slpin.universalservice.org/'
urlopen(url).read()
最佳答案
从this SSLLabs report可以看出您尝试访问的服务器严重损坏。它的等级为 F(最差),这主要是由于其可怕的不安全密码:
唯一不可怕的不安全但唯一弱的密码使用 3DES。由于这个弱点,这个密码可能不包含在你平台上的 openssl 构建中(例如 Debian 和基于 Debian 的系统,如 Ubuntu 不包含这个密码)。
这意味着从 Python 脚本访问服务器的唯一方法是使用链接到旧版本 OpenSSL 或链接到现代版本但明确包含此密码的 Python 版本。即使那样,您也可能需要专门启用 3DES,因为 urllib 暂时禁用了它。因此,当使用具有 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 Forbidden
,它与我使用浏览器访问此 URL 时得到的结果相匹配。
关于python-3.x - 如何使用仅支持 TLS 1.0 的主机处理 Python 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55751896/