python - ssl.SSLError: tlsv1 अलर्ट प्रोटोकॉल संस्करण




https cisco (5)

आपको केवल इतना करना है कि आप अपने virtualenv में requests[security] स्थापित करें। आपको पायथन 3 का उपयोग नहीं करना चाहिए (यह पायथन 2.7 में काम करना चाहिए)। इसके अलावा, यदि आप macOS के हाल के संस्करण का उपयोग कर रहे हैं, तो आपको OpenSSL को अलग से स्थापित करने के लिए homebrew का उपयोग करने की आवश्यकता नहीं है।

$ virtualenv --python=/usr/bin/python tempenv  # uses system python
$ . tempenv/bin/activate
$ pip install requests
$ python
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8zh 14 Jan 2016'  # this is the built-in openssl
>>> import requests
>>> requests.get('https://api.github.com/users/octocat/orgs')
requests.exceptions.SSLError: HTTPSConnectionPool(host='api.github.com', port=443): Max retries exceeded with url: /users/octocat/orgs (Caused by SSLError(SSLError(1, u'[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590)'),))
$ pip install 'requests[security]'
$ python  # install requests[security] and try again
>>> import requests
>>> requests.get('https://api.github.com/users/octocat/orgs')
<Response [200]>

requests[security] कनेक्शन से बातचीत करते समय अनुरोध टीएलएस के नवीनतम संस्करण का उपयोग करने की अनुमति देता है। MacOS पर अंतर्निहित ओपनएसएल टीएलएस v1.2 का समर्थन करता है।

OpenSSL का अपना संस्करण स्थापित करने से पहले, यह प्रश्न पूछें: Google Chrome को https://github.com कैसे लोड किया जा रहा है?

मैं एक सिस्को CMX डिवाइस के लिए REST एपीआई का उपयोग कर रहा हूं, और पायथन कोड लिखने की कोशिश कर रहा हूं, जो जानकारी के लिए एपीआई के लिए एक GET अनुरोध करता है। कोड निम्नानुसार है और आवश्यक जानकारी को छोड़कर फ़ाइल में वैसा ही है।

from http.client import HTTPSConnection
from base64 import b64encode


# Create HTTPS connection
c = HTTPSConnection("0.0.0.0")

# encode as Base64
# decode to ascii (python3 stores as byte string, need to pass as ascii 
value for auth)
username_password = b64encode(b"admin:password").decode("ascii")
headers = {'Authorization': 'Basic {0}'.format(username_password)}

# connect and ask for resource
c.request('GET', '/api/config/v1/aaa/users', headers=headers)

# response
res = c.getresponse()

data = res.read()

हालाँकि, मुझे लगातार निम्न त्रुटि हो रही है:

Traceback (most recent call last):
  File "/Users/finaris/PycharmProjects/test/test/test.py", line 14, in <module>
    c.request('GET', '/api/config/v1/aaa/users', headers=headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1106, in request
    self._send_request(method, url, body, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1151, in _send_request
    self.endheaders(body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1102, in endheaders
    self._send_output(message_body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 934, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 877, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1260, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 377, in wrap_socket
    _context=self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 752, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 988, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 633, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:645)

मैंने ओपनएसएसएल को भी अपडेट करने की कोशिश की लेकिन इसका कोई असर नहीं हुआ।


जुलाई 2018 तक, Pypi को अब आवश्यकता है कि इससे जुड़ने वाले ग्राहक TLS 1.2 का उपयोग करें। यदि आप MacOS (2.7.10) के साथ शिप किए गए अजगर के संस्करण का उपयोग कर रहे हैं तो यह एक समस्या है क्योंकि यह केवल TLS 1.0 का समर्थन करता है। आप ssl के संस्करण को बदल सकते हैं जो अजगर समस्या को ठीक करने या अजगर के नए संस्करण में अपग्रेड करने के लिए उपयोग कर रहा है। डिफ़ॉल्ट लाइब्रेरी स्थान के बाहर अजगर के नए संस्करण को स्थापित करने के लिए होमब्रे का उपयोग करें।

brew install [email protected]

मेरा मानना ​​है कि TLSV1_ALERT_PROTOCOL_VERSION आपको सचेत कर रहा है कि सर्वर आपसे TLS v1.0 बात नहीं करना चाहता। टीएलएस v1.2 को केवल इन पंक्तियों में चिपकाकर निर्दिष्ट करने का प्रयास करें:

import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)

# Create HTTPS connection
c = HTTPSConnection("0.0.0.0", context=context)

ध्यान दें, आपको पाइथन के नए संस्करणों (2.7.9+ शायद?) और संभवतः ओपनएसएसएल की आवश्यकता हो सकती है (मेरे पास "ओपनएसएसएल 1.0.2k 26 जनवरी 2017" है और ऊपर काम करने के लिए लगता है, वाईएमएमवी)


मेरे पास एक ही त्रुटि थी और Google ने मुझे इस सवाल पर लाया, इसलिए यहां मैंने ऐसा किया है, उम्मीद है कि यह एक समान स्थिति में दूसरों की मदद करता है।

यह OS X के लिए लागू है।

OpenSSL के कौन से संस्करण में टर्मिनल में जाँच करें:

$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
>> OpenSSL 0.9.8zh 14 Jan 2016

जैसा कि ओपनएसएसएल का मेरा संस्करण बहुत पुराना था, स्वीकृत जवाब से काम नहीं चला।

इसलिए मुझे ओपनएसएसएल को अपडेट करना पड़ा। ऐसा करने के लिए, मैंने होमब्रे के साथ नवीनतम संस्करण (संस्करण 3.5 से संस्करण 3.6 तक) के लिए पायथन को अद्यतन किया, यहां दिए गए कुछ चरणों के बाद:

$ brew update
$ brew install openssl
$ brew install python3

तब मुझे PATH और अजगर के संस्करण के उपयोग में समस्या आ रही थी, इसलिए मैंने सिर्फ एक नया virtualenv बनाया, जिससे यह सुनिश्चित हो सके कि अजगर का सबसे नया संस्करण लिया गया है:

$ virtualenv webapp --python=python3.6

समस्या का समाधान हो गया।


स्वीकृत उत्तरों में से किसी ने भी मुझे सही दिशा में नहीं बुलाया, और यह अभी भी सवाल है जो विषय की खोज करते समय सामने आता है, इसलिए यहां मेरी (आंशिक रूप से) सफल गाथा है।

पृष्ठभूमि: मैं एक बीगलबोन ब्लैक पर एक पायथन स्क्रिप्ट चलाता हूं जो कि क्रिप्टोक्यूरेंसी एक्सचेंज पोलोनीक्स को python-poloniex लाइब्रेरी का उपयोग करते हुए python-poloniex है। इसने अचानक TLSV1_ALERT_PROTOCOL_VERSION त्रुटि के साथ काम करना बंद कर दिया।

यह बताता है कि ओपनएसएसएल ठीक था, और एक v1.2 कनेक्शन के लिए मजबूर करने की कोशिश कर रहा था एक विशाल जंगली हंस पीछा - पुस्तकालय आवश्यक रूप से नवीनतम संस्करण का उपयोग करेगा। श्रृंखला में कमजोर लिंक वास्तव में पायथन था, जिसने केवल ssl.PROTOCOL_TLSv1_2 परिभाषित किया ssl.PROTOCOL_TLSv1_2 , और इसलिए संस्करण 3.4 के बाद से TLS v1.2 का समर्थन करना शुरू कर दिया।

इस बीच, बीगलबोन पर डेबियन का संस्करण पायथन 3.3 को नवीनतम मानता है। मेरे द्वारा उपयोग किए जाने वाले वर्कअराउंड को स्रोत से Python 3.5 को स्थापित करना था (3.4 ने अंततः काम भी किया हो सकता है, लेकिन घंटों परीक्षण और त्रुटि के बाद मुझे किया गया है:

sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
wget https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz
sudo tar xzf Python-3.5.4.tgz
cd Python-3.5.4
./configure
sudo make altinstall

शायद उन सभी पैकेजों को कड़ाई से आवश्यक नहीं है, लेकिन उन सभी को एक बार में स्थापित करने से रिट्रीस का एक गुच्छा बच जाता है। altinstall मौजूदा python बायनेरिज़ को clobbering से स्थापित करने से रोकता है, बजाय python3.5 रूप में स्थापित कर रहा है, हालांकि इसका मतलब है कि आपको अतिरिक्त पुस्तकालयों को फिर से स्थापित करना होगा। ./configure ने पांच या दस मिनट का अच्छा समय लिया। make को कुछ घंटे लगे।

अब यह तब भी काम नहीं आया जब तक कि मैं आखिरकार नहीं भागा

sudo -H pip3.5 install requests[security]

जो pyOpenSSL , cryptography और idna भी इंस्टॉल करता है। मुझे संदेह है कि pyOpenSSL कुंजी थी, इसलिए शायद pip3.5 install -U pyopenssl पर्याप्त होगा, लेकिन मैंने यह सुनिश्चित करने के लिए पहले ही इस पर बहुत लंबा समय बिताया है।

सारांश में, यदि आपको Python में TLSV1_ALERT_PROTOCOL_VERSION त्रुटि मिलती है, तो संभवतः यह इसलिए है क्योंकि आप TLS v1.2 का समर्थन नहीं कर सकते। समर्थन जोड़ने के लिए, आपको कम से कम निम्नलिखित की आवश्यकता होगी:

  • ओपनएसएसएल 1.0.1
  • पायथन 3.4
  • अनुरोध [सुरक्षा]

इससे मुझे TLSV1_ALERT_PROTOCOL_VERSION पिछले मिल गया है, और अब मुझे इसके बजाय SSL23_GET_SERVER_HELLO से लड़ाई करनी है।

गलत एसएसएल संस्करण का चयन करके पायथन के मूल मुद्दे पर वापस आ गया है। ssl_version=ssl.PROTOCOL_TLSv1_2 साथ अनुरोध सत्र को माउंट करने के लिए this ट्रिक का उपयोग करके इसकी पुष्टि की जा सकती है। इसके बिना, SSLv23 का उपयोग किया जाता है और SSL23_GET_SERVER_HELLO त्रुटि दिखाई देती है। इसके साथ, अनुरोध सफल होता है।

अंतिम लड़ाई TLSv1_2 को बलपूर्वक उठाया जाना था जब अनुरोध को तीसरे पक्ष के पुस्तकालय के भीतर गहरा किया जाता है। इस विधि और इस पद्धति दोनों ने चाल चलनी चाहिए, लेकिन दोनों में कोई अंतर नहीं किया। मेरा अंतिम समाधान भयानक है, लेकिन प्रभावी है। मैंने /usr/local/lib/python3.5/site-packages/urllib3/util/ssl_.py और परिवर्तित संपादित किया

def resolve_ssl_version(candidate):
    """
    like resolve_cert_reqs
    """
    if candidate is None:
        return PROTOCOL_SSLv23

    if isinstance(candidate, str):
        res = getattr(ssl, candidate, None)
        if res is None:
            res = getattr(ssl, 'PROTOCOL_' + candidate)
        return res

    return candidate

सेवा

def resolve_ssl_version(candidate):
    """
    like resolve_cert_reqs
    """
    if candidate is None:
        return ssl.PROTOCOL_TLSv1_2

    if isinstance(candidate, str):
        res = getattr(ssl, candidate, None)
        if res is None:
            res = getattr(ssl, 'PROTOCOL_' + candidate)
        return res

    return candidate

और वॉइला, मेरी स्क्रिप्ट अंततः सर्वर से फिर से संपर्क कर सकती है।





cisco