社内ネットワークを使って開発をしていると、Proxyをはじめとしたさまざまなトラップに引っ掛かります。
先日、Pythonで某モジュールを使おうとしたらモジュール内部のrequests
でSSLサーバ証明書の検証に失敗し、requests.exceptions.SSLError
が発生しました。
通常、requests
でSSLサーバ証明書の検証を無効化するには、次のように書きます。
requests.get("https://www.google.com", verify=False)
ただし、このやり方はコードの修正が必要なので、モジュール内部のrequests
には使えません。
調べたところ、次のrequests
をハックするやり方が見つかりましたので、紹介します。
やり方
環境変数CURL_CA_BUNDLE
に空文字を設定します。
import os
os.environ['CURL_CA_BUNDLE'] = ''
仕組み
requests
には次のように環境変数CURL_CA_BUNDLE
とREQUESTS_CA_BUNDLE
でverify
を上書きする処理があります。これをハックしてverify
をFalse
にします。
if verify is True or verify is None:
verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
os.environ.get('CURL_CA_BUNDLE'))
実際にはFalse
にするのではなく、False
と評価される空文字にします。なぜ同様にFalse
と評価されるNone
ではダメで空文字にするかというと、None
だと後にTrue
で上書きされるからです。
ここでPythonのor
の仕組みを簡単に説明すると、A or B
はA == True
のときA
、A == False
のときB
を返します。よって
>>> None or None
None
>>> '' or None
None
>>> None or ''
''
となります。これを利用すれば環境変数CURL_CA_BUNDLE
に空文字を設定してverify
を空文字、つまりFalse
にすることができます。