Requests: SSLV3_ALERT_HANDSHAKE_FAILURE في Python 3.5 ، يعمل في Python 2.7

تم إنشاؤها على ٣٠ يوليو ٢٠١٨  ·  3تعليقات  ·  مصدر: psf/requests

أنا أقوم بتشغيل الكود التالي:

import requests
import ssl
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager

class SSLAdapter(HTTPAdapter):
    '''An HTTPS Transport Adapter that uses an arbitrary SSL version.'''
    def __init__(self, ssl_version=None, **kwargs):
        self.ssl_version = ssl_version

        super(SSLAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       ssl_version=self.ssl_version)

s = requests.Session()
s.mount('https://', SSLAdapter(ssl.PROTOCOL_TLSv1_2))

print(ssl.OPENSSL_VERSION)

r = s.get('https://bibliothek.weltenbau.net/api/profile/265854176393691138')
print(r.status_code)

باستخدام Python 3.5.3 ، أحصل على الأخطاء التالية:

OpenSSL 1.1.0f  25 May 2017
Traceback (most recent call last):
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 849, in _validate_conn
    conn.connect()
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connection.py", line 356, in connect
    ssl_context=context)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/util/ssl_.py", line 359, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.5/ssl.py", line 385, in wrap_socket
    _context=self)
  File "/usr/lib/python3.5/ssl.py", line 760, in __init__
    self.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 996, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 641, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/adapters.py", line 445, in send
    timeout=timeout
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/urllib3/util/retry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='bibliothek.weltenbau.net', port=443): Max retries exceeded with url: /api/profile/265854176393691138 (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)'),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 24, in <module>
    r = s.get('https://bibliothek.weltenbau.net/api/profile/265854176393691138')
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/sessions.py", line 525, in get
    return self.request('GET', url, **kwargs)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/sessions.py", line 512, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/sessions.py", line 622, in send
    r = adapter.send(request, **kwargs)
  File "/opt/weltenbau-bot/.venv/lib/python3.5/site-packages/requests/adapters.py", line 511, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='bibliothek.weltenbau.net', port=443): Max retries exceeded with url: /api/profile/265854176393691138 (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)'),))

باستخدام Python 2.7.13 ، كل شيء يعمل كما هو متوقع:

OpenSSL 1.1.0f  25 May 2017
200

معلومات النظام

Python 3.5.3

الطلبات

{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.5.3"
  },
  "platform": {
    "release": "4.9.0-6-amd64",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "1010006f"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": false
}

تجميد النقطة

certifi==2018.4.16
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23

بايثون 2.7.13:

الطلبات

{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "2.7.13"
  },
  "platform": {
    "release": "4.9.0-6-amd64",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "1010006f"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": false
}

تجميد النقطة

certifi==2018.4.16
chardet==3.0.4
idna==2.7
requests==2.19.1
urllib3==1.23

حل ممكن

يبدو أن تثبيت pyOpenSSL في Python3 venv يصلح هذه المشكلة.

التعليق الأكثر فائدة

مرحبا هل وجدت حلا؟

ال 3 كومينتر

مرحبًا ghtyrant ،

يبدو أن هناك بعض التباين في إعداد SSL الخاص بك بين كل تثبيت للبيثون. المترجم 3.5 غير قادر على التفاوض على بروتوكول مقبول مع الخادم. حقيقة أن تثبيت PyOpenSSL يحل هذا يشير إلى وجود خطأ ما في إعداد 3.5 SSL الخاص بك.

لسوء الحظ ، لم أتمكن من إعادة إنتاج هذا محليًا بين تثبيتات 2.7.13 و 3.5.3 أيضًا. أعتقد أنه كانت هناك بعض المشكلات في الأصل مع OpenSSL 1.1 ولم يتم بناء Python معًا بشكل جيد بسبب تغييرات API / الهيكل.

النصيحة الوحيدة التي يمكنني تقديمها في الوقت الحالي هي النظر في إعادة تثبيت 3.5.3 ضد نظام OpenSSL الخاص بك ، أو الترقية إلى 3.5.6. لست متأكدًا من أنني أرى ارتباطًا واضحًا لعيب في الطلبات والسلوك الذي تتم ملاحظته. سأغلق هذا الآن ولكن إذا وجدت المزيد من المعلومات ، فلا تتردد في إعادة فتحه. شكرا!

صادف ذلك عندما واجهت نفس المشكلة عند تثبيت OpenSSL 1.1.1b من bund.sury.org على دبيان 9. كانت هذه أسهل طريقة للحصول على أحدث إصدار من nginx و TLS 1.3.

ومع ذلك ، يبدو أنه لا يعمل بشكل جيد مع تثبيت Python الافتراضي (3.5.3) وكان يتسبب في هذا الخطأ في تطبيق Django. يؤدي تثبيت pyOpenSSL إلى إصلاح المشكلة.

أعتقد أنه سيتعين علينا انتظار Debian 10 حتى يعمل TLS 1.3 و Python معًا بشكل صحيح ؛-)

مرحبا هل وجدت حلا؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات