python - python请求中的OpenSSL错误

标签 python python-3.x ssl python-requests openssl

在带有 OpenSSL 版本 1.1.1i 和 pyopenssl 版本 1.1.1i 的 arch linux 上运行 python 版本 3.9.1 尝试将 https 代理与 requests 模块一起使用时出现以下错误:

    Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/urllib3/connectionpool.py", line 696, in urlopen
    self._prepare_proxy(conn)
  File "/usr/lib/python3.9/site-packages/urllib3/connectionpool.py", line 964, in _prepare_proxy
    conn.connect()
  File "/usr/lib/python3.9/site-packages/urllib3/connection.py", line 359, in connect
    conn = self._connect_tls_proxy(hostname, conn)
  File "/usr/lib/python3.9/site-packages/urllib3/connection.py", line 496, in _connect_tls_proxy
    return ssl_wrap_socket(
  File "/usr/lib/python3.9/site-packages/urllib3/util/ssl_.py", line 424, in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)
  File "/usr/lib/python3.9/site-packages/urllib3/util/ssl_.py", line 466, in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock)
  File "/usr/lib/python3.9/ssl.py", line 500, in wrap_socket
    return self.sslsocket_class._create(
  File "/usr/lib/python3.9/ssl.py", line 1040, in _create
    self.do_handshake()
  File "/usr/lib/python3.9/ssl.py", line 1309, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
    resp = conn.urlopen(
  File "/usr/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
    retries = retries.increment(
  File "/usr/lib/python3.9/site-packages/urllib3/util/retry.py", line 573, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='google.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)')))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/site-packages/requests/api.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3.9/site-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3.9/site-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3.9/site-packages/requests/adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='google.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)')))
我正在运行的代码是:
import requests

proxy = {
    'https' : 'https://proxyip:proxyport'
}

requests.get("https://google.com", proxies=proxy)

无论我尝试什么 https 代理,我都会遇到同样的错误。我还重新安装了 openssl 和 python,没有任何变化。有什么建议么?

最佳答案

... line 496, in _connect_tls_proxy

您的代码正在尝试使用(新)支持通过 HTTPS 访问代理本身。这样做是因为您已明确将该 URL 作为代理指定为 https://...而不是 http://... :
'https' : 'https://proxyip:proxyport'
           ^^^^^^

代理本身很可能不支持到代理的 TLS 连接。通常,HTTP 代理仅与代理有纯 HTTP 连接。他们仍然可以通过这种方式代理 HTTPS 流量,因为客户端将简单地向代理发出 CONNECT 请求以创建隧道,然后在客户端和服务器之间使用端到端 TLS。
通过 HTTPS 访问代理会添加一个 附加 客户端和代理之间的 TLS 层,大多数代理不支持。因此,您可能需要普通的 HTTP 代理:
 'https' : 'http://proxyip:proxyport'
           ^^^^^^
请注意,在旧版本的 requests 库中,两者都使用 http:// 访问。和 https://工作。这些旧版本不支持代理的 HTTPS,即使 https:// 也只是使用纯 HTTP。将被指定。

关于python - python请求中的OpenSSL错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65783493/

相关文章:

使用 pip 将 Python 包安装为 UNKNOWN

python - 从字典中存在的列表值中获取单个 "set"对象

Python 不可排序类型 : NoneType() > int() when finding max of a list

http - Nginx 服务器 : SSL_ERROR_RX_RECORD_TOO_LONG

asp.net - 集成 Windows 身份验证和 SSL

python - 从 python 中的 c 模块捕获打印输出

python - 在 Python 中过滤 SQL 语句以防止恶意注入(inject)

python - 根据 3 个变量的颜色 - 麦克斯韦三角形

python-3.x - 使用循环展开元组与不使用循环展开元组

wordpress - https 和 http 组合 .htaccess(不同的问题)