मैं पायथन अनुरोधों में सुरक्षा प्रमाणपत्र जांच को कैसे अक्षम कर सकता हूं


230

मै इस्तेमाल कर रहा हूँ

import requests
requests.post(url='https://foo.com', data={'bar':'baz'})

लेकिन मुझे एक request.exception.SSLError मिलती है। वेबसाइट की समय सीमा समाप्त हो चुकी है, लेकिन मैं संवेदनशील डेटा नहीं भेज रहा हूं, इसलिए यह मेरे लिए कोई मायने नहीं रखता। मुझे लगता है कि 'verifiy = False' जैसा एक तर्क है जिसका मैं उपयोग कर सकता हूं, लेकिन मैं इसे ढूंढ नहीं सकता।

जवाबों:


411

से प्रलेखन :

requestsयदि आप verifyगलत पर सेट करते हैं तो एसएसएल प्रमाणपत्र की पुष्टि करने पर भी ध्यान न दें ।

>>> requests.get('https://kennethreitz.com', verify=False)
<Response [200]>

यदि आप तृतीय-पक्ष मॉड्यूल का उपयोग कर रहे हैं और चेक को अक्षम करना चाहते हैं, तो यहां एक संदर्भ प्रबंधक है जो बंदर को पैच करता है requestsऔर इसे बदलता है ताकि verify=Falseडिफ़ॉल्ट हो और चेतावनी को दबा सके।

import warnings
import contextlib

import requests
from urllib3.exceptions import InsecureRequestWarning


old_merge_environment_settings = requests.Session.merge_environment_settings

@contextlib.contextmanager
def no_ssl_verification():
    opened_adapters = set()

    def merge_environment_settings(self, url, proxies, stream, verify, cert):
        # Verification happens only once per connection so we need to close
        # all the opened adapters once we're done. Otherwise, the effects of
        # verify=False persist beyond the end of this context manager.
        opened_adapters.add(self.get_adapter(url))

        settings = old_merge_environment_settings(self, url, proxies, stream, verify, cert)
        settings['verify'] = False

        return settings

    requests.Session.merge_environment_settings = merge_environment_settings

    try:
        with warnings.catch_warnings():
            warnings.simplefilter('ignore', InsecureRequestWarning)
            yield
    finally:
        requests.Session.merge_environment_settings = old_merge_environment_settings

        for adapter in opened_adapters:
            try:
                adapter.close()
            except:
                pass

यहां बताया गया है कि आप इसका उपयोग कैसे करते हैं:

with no_ssl_verification():
    requests.get('https://wrong.host.badssl.com/')
    print('It works')

    requests.get('https://wrong.host.badssl.com/', verify=True)
    print('Even if you try to force it to')

requests.get('https://wrong.host.badssl.com/', verify=False)
print('It resets back')

session = requests.Session()
session.verify = True

with no_ssl_verification():
    session.get('https://wrong.host.badssl.com/', verify=True)
    print('Works even here')

try:
    requests.get('https://wrong.host.badssl.com/')
except requests.exceptions.SSLError:
    print('It breaks')

try:
    session.get('https://wrong.host.badssl.com/')
except requests.exceptions.SSLError:
    print('It breaks here again')

ध्यान दें कि यह कोड उन सभी खुले एडाप्टरों को बंद कर देता है जो एक बार संदर्भ प्रबंधक को छोड़ने के बाद एक पैच किए गए अनुरोध को संभालते हैं। ऐसा इसलिए है क्योंकि अनुरोध प्रति-सत्र कनेक्शन पूल बनाए रखता है और प्रमाणपत्र सत्यापन केवल एक बार कनेक्शन के अनुसार होता है इसलिए इस तरह की अप्रत्याशित चीजें होंगी:

>>> import requests
>>> session = requests.Session()
>>> session.get('https://wrong.host.badssl.com/', verify=False)
/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
<Response [200]>
>>> session.get('https://wrong.host.badssl.com/', verify=True)
/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
<Response [200]>

6
धन्यवाद, यह काम करता है यदि आपके पास अपने स्वयं के कोड के अंदर कुछ अनुरोध कॉल हैं, लेकिन कल्पना करें कि मैं इसे तीसरे आंशिक रूप से पुस्तकालय में अक्षम करना चाहता हूं जो अनुरोधों का उपयोग करता है, ... इस तरह से तृतीय पक्ष के दायित्व को ठीक करना असंभव होगा।
सोरिन

7
@ साओरीन: बस बंदर पैच requestsऔर verifyडिफ़ॉल्ट के लिए है False
ब्लेंडर

2
मैं उस बड़े गंदे चेतावनी संदेश को कैसे दबाऊं जो अभी भी छपा है?
माइकल

27
@ मेरे सवाल का जवाब देने के लिए requests.packages.urllib3.disable_warnings()
माइकल

8
@ from urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
मिचेल

96

उपयोग requests.packages.urllib3.disable_warnings()और तरीकों verify=Falseपर requests

import requests
from urllib3.exceptions import InsecureRequestWarning

# Suppress only the single warning from urllib3 needed.
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

# Set `verify=False` on `requests.post`.
requests.post(url='https://example.com', data={'bar':'baz'}, verify=False)

11
जब आप "Unverified HTTPS अनुरोध किया जा रहा है" जैसी चेतावनियों से छुटकारा पाना चाहते हैं तो आपका उत्तर उपयोगी है। लेकिन verify=Falseवैसे भी मौजूद होना चाहिए। Tnx।
लुफा

17
और सभी चेतावनियों को छिपाने से बचने के लिए: from urllib3.exceptions import InsecureRequestWarningतबrequests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
सेबास्टियन डेप्रेज़

उन लोगों के लिए जो चेतावनी को अक्षम नहीं कर सकते, आप कोशिश कर सकते हैं requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)। यह काम करता है क्योंकि यह सुनिश्चित करता है कि इसका urllib3.exceptions.InsecureRequestWarningसटीक उपयोग किसके द्वारा किया जाता है requests
एनीफ्रॉमटाइवन

32

ब्लेंडर के उत्तर में जोड़ने के लिए , आप उपयोग कर रहे सभी अनुरोधों के लिए एसएसएल को निष्क्रिय कर सकते हैंSession.verify = False

import requests

session = requests.Session()
session.verify = False
session.post(url='https://foo.com', data={'bar':'baz'})

ध्यान दें कि urllib3, (जो अनुरोध का उपयोग करता है), दृढ़ता से असत्यापित HTTPS अनुरोध बनाने को हतोत्साहित करता है और एक बढ़ाएगा InsecureRequestWarning


11

पर्यावरण चर से भी किया जा सकता है:

export CURL_CA_BUNDLE=""

1
यह मुझे देता है: "OSError: एक उपयुक्त TLS CA प्रमाणपत्र बंडल नहीं मिला, अमान्य पथ:" "। मैं अनुरोध का उपयोग कर रहा हूं 2.22.0
chaim

याexport REQUESTS_CA_BUNDLE='your-ca.pem'
weaming

1
ऐसा लगता है कि यदि आप किसी ऐसे पुस्तकालय का उपयोग करने की आवश्यकता है जिसका आप उपयोग नहीं कर सकते हैं तो इसका सबसे अच्छा उत्तर होगा
user989762

के आधार पर CURL_CA_BUNDLE , os.environ['REQUESTS_CA_BUNDLE'] = 'FiddlerRootCertificate_Base64_Encoded_X.509.cer.pem' # your-ca.pemअजगर 3.8.3 के लिए काम करता है का उपयोग करते समय गूगल-बादल-bigquery 1.24.0 और BigQuery ग्राहक लिब के लिए अजगर
सैम

8

यदि आप सत्यापन = गलत विकल्प के साथ बिल्कुल पोस्ट अनुरोध भेजना चाहते हैं, तो इस कोड का उपयोग करने का सबसे तेज़ तरीका है:

import requests

requests.api.request('post', url, data={'bar':'baz'}, json=None, verify=False)

जब आप सत्यापन अक्षम करते हैं, तो दस्यु खुश नहीं होगा। देखें: docs.openstack.org/bandit/latest/plugins/…
kRazzy R

नमस्ते, मेरा एक अनुरोध है जो मुझे सेटिंग विकल्प में 'एसएसएल प्रमाणपत्र सत्यापन' को अक्षम करके पोस्टमैन में पोस्ट अनुरोध की प्रतिक्रिया देता है। लेकिन, अगर मुझे पोस्टमैन द्वारा प्रदान किया गया अजगर अनुरोध कोड मिलता है, तो मुझे "SSL रूटीन ',' tls_process_server_certificate ',' प्रमाणपत्र सत्यापन विफल" त्रुटि प्राप्त होगी और 'सत्यापित' झूठी जोड़ने से इस मामले में मदद नहीं मिलती है, अजगर अनुरोध स्क्रिप्ट में डाकिया की प्रतिक्रिया पाने के लिए कोई समाधान है?
ताहा हमीदानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.