পাইথনের অনুরোধগুলিতে আমি সুরক্ষা শংসাপত্র চেকটি কীভাবে অক্ষম করব


230

আমি ব্যাবহার করছি

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

তবে আমি একটি অনুরোধ পেয়েছি ex ওয়েবসাইটটির মেয়াদোত্তীর্ণ সার্টিফিকেট রয়েছে, তবে আমি সংবেদনশীল ডেটা পাঠাচ্ছি না, তাই এটি আমার কাছে আসে না। আমি ভাবতে পারি যে 'ভেরিফাই = মিথ্যা' এর মতো একটি যুক্তি রয়েছে যা আমি ব্যবহার করতে পারি তবে আমি এটি খুঁজে পাচ্ছি না।

উত্তর:


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
এখনও ছাপানো বড় কদর্য সতর্কতা বার্তা আমি কীভাবে দমন করব?
মাইকেল 18

27
@ requests.packages.urllib3.disable_warnings()
মিচেল

8
@ মিশেল: বা সমস্ত সতর্কতাগুলি আড়াল করা এড়ানোর জন্য: from urllib3.exceptions import InsecureRequestWarningতারপরেrequests.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
যখন আপনি "যাচাই না করা 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, (যা অনুরোধগুলি ব্যবহার করে), যাচাই করা হয়েছে যাচাইকৃত এইচটিটিপিএস অনুরোধগুলি তৈরি করতে কঠোরভাবে নিরুৎসাহিত করে এবং এটি উত্থাপন করবে InsecureRequestWarning


11

পরিবেশ পরিবর্তনশীল থেকেও করা যেতে পারে:

export CURL_CA_BUNDLE=""

1
এটি আমাকে দেয়: "ওএসআরআর: উপযুক্ত টিএলএস সিএ শংসাপত্র বান্ডিলটি খুঁজে পেল না, অবৈধ পথ:" "আমি অনুরোধটি ব্যবহার করছি ২.২২.০
চেইম

বাexport REQUESTS_CA_BUNDLE='your-ca.pem'
ওয়েলিং

1
আপনি সম্পাদনা করতে পারবেন না এমন কোনও লাইব্রেরি ব্যবহার করা দরকার এমন ক্ষেত্রে এটি সেরা উত্তর বলে মনে হচ্ছে
user989762

উপর ভিত্তি করে CURL_CA_BUNDLE , os.environ['REQUESTS_CA_BUNDLE'] = 'FiddlerRootCertificate_Base64_Encoded_X.509.cer.pem' # your-ca.pemপাইথন 3.8.3 জন্য কাজ যখন ব্যবহার Google এর মেঘ-BigQuery 1.24.0 এবং BigQuery- তে ক্লায়েন্ট প্রচ্ছদ জন্য পাইথন
samm

8

আপনি যদি যাচাই = মিথ্যা বিকল্পের সাথে হুবহু পোস্টের অনুরোধটি পাঠাতে চান তবে দ্রুততম উপায়টি এই কোডটি ব্যবহার করা:

import requests

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

আপনি যাচাই = মিথ্যা অক্ষম করলে ডাকাত খুশি হবে না। দেখুন: docs.openstack.org/bandit/latest/plugins/...
Krazzy আর

হাই, আমার কাছে একটি অনুরোধ রয়েছে যা সেটিংস বিকল্পে 'এসএসএল শংসাপত্র যাচাইকরণ' অক্ষম করে পোস্টম্যানে পোস্ট অনুরোধের প্রতিক্রিয়া দেয় gives তবে, যদি আমি পোস্টম্যান দ্বারা প্রদত্ত পাইথন অনুরোধ কোডটি পাই তবে আমি "এসএসএল রুটিনগুলি", 'tls_process_server_cerર્ટate', 'শংসাপত্র যাচাইকরণ ব্যর্থ হয়েছে "ত্রুটি পেয়েছি এবং' যাচাই = মিথ্যা 'যুক্ত করা এই ক্ষেত্রে সহায়তা করে না, অজগর অনুরোধ স্ক্রিপ্টে পোস্টম্যানের প্রতিক্রিয়া পাওয়ার কোন সমাধান আছে?
তাহা হামেদানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.