Pythonリクエストでセキュリティ証明書のチェックを無効にする方法


230

使ってます

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

しかし、request.exceptions.SSLErrorを受け取ります。Webサイトには有効期限が切れた証明書がありますが、機密データを送信していないので、私には関係ありません。'verifiy = False'のような使用可能な引数があると想像しますが、それを見つけることができないようです。

回答:


411

ドキュメントから:

requestsまたverify、Falseに設定すると、SSL証明書の検証を無視できます 。

>>> 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')

このコードは、コンテキストマネージャを終了すると、パッチが適用された要求を処理したすべての開いているアダプタを閉じることに注意してください。これは、リクエストがセッションごとの接続プールを維持し、証明書の検証が接続ごとに1回だけ行われるため、次のような予期しないことが発生するためです。

>>> 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
おかげで、これは自分のコード内でリクエスト呼び出しがほとんどない場合に機能しますが、リクエストを使用するサードパーティのライブラリでこれを無効にしたいと想像してください...このようにサードパーティのlibを修正することは不可能です。
ソリン

7
@sorin:モンキーパッチのみでrequestsverifyデフォルトはですFalse
Blender

2
それでも印刷される大きな厄介な警告メッセージを抑制するにはどうすればよいですか?
Michael

27
@Michaelが自分の質問に答える:requests.packages.urllib3.disable_warnings()
Michael

8
@Michael:またはすべての警告を非表示に回避するために:from urllib3.exceptions import InsecureRequestWarningその後requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
セバスチャン・Deprez

96

使用requests.packages.urllib3.disable_warnings()してverify=Falserequests方法。

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。
Lufa 2016年

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です。
AnnieFromTaiwan

32

Blenderの回答に追加するには、すべてのリクエストに対してSSLを無効にすることができます。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'
ウィーミング

1
これは、編集できないライブラリを使用する必要がある場合の最良の答えのようです
user989762

CURL_CA_BUNDLEに基づき、google-cloud-bigquery 1.24.0BigQuery Client Lib for Pythonos.environ['REQUESTS_CA_BUNDLE'] = 'FiddlerRootCertificate_Base64_Encoded_X.509.cer.pem' # your-ca.pemを使用する場合、Python 3.8.3 で機能します
samm

8

verify = Falseオプションを使用してpostリクエストを正確に送信する場合は、次のコードを使用するのが最も速い方法です。

import requests

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

verify = Falseを無効にすると、Banditは満足できなくなります。参照:docs.openstack.org/bandit/latest/plugins/…–
kRazzy R

こんにちは。設定オプションで「SSL証明書の検証」を無効にすることで、Postmanでの投稿リクエストの応答を要求するリクエストがあります。しかし、Postmanから提供されたpythonリクエストコードを取得すると、「SSLルーチン」、「tls_process_server_certificate」、「certificate verify failed」エラーが発生し、「verify = False」を追加してもこの場合は役に立ちません。 PythonリクエストスクリプトでPostmanの応答を取得するための解決策はありますか?
タハハメダニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.