أنا أقوم بتشغيل الكود التالي:
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
{
"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
{
"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 يصلح هذه المشكلة.
مرحبًا 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 معًا بشكل صحيح ؛-)
مرحبا هل وجدت حلا؟
التعليق الأكثر فائدة
مرحبا هل وجدت حلا؟