Pythonリクエストに自己署名SSL証明書を信頼させる方法は?


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

URLが自己署名証明書を使用している場合、これは次のように失敗します。

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

次のようFalseに、verifyパラメーターに渡すことができることを知っています。

r = requests.post(url, data=data, verify=False)

ただし、私がやりたいのは、ディスク上の公開鍵のコピーへの要求をポイントし、その証明書を信頼するように指示することです。


回答:


61

試してください:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')

1
同じことを行い、同時にクライアント証明書を使用できますか?これで問題が発生します。
user11565 4419年

10
渡す.pemファイルには、サーバーの証明書と中間証明書が含まれている必要があることに注意してください。サーバーの証明書を追加した後、なぜ機能しなかったのかを理解しようとして、数時間を失いました。
ChrisBob

自己署名証明書.pemを追加しましたが、機能しました。
HSRathore19年

6
このテクニックは私にはうまくいきませんでした。以前ssl.get_server_certificateはの証明書をダウンロードし、その証明書を(self-signed.badssl.com, 443)に保存してからcert.pem実行requests.get('https://self-signed.badssl.com/', verify='cert.pem')しましたが、SSLエラーで失敗しました(その証明書は自己署名されています)。
Jason R.Coombs19年

41

このverifyパラメーターを使用すると、カスタム認証局バンドルを提供できます

requests.get(url, verify=path_to_bundle_file)

ドキュメントから:

verify信頼できるCAの証明書を使用してCA_BUNDLEファイルへのパスを渡すことができます。この信頼できるCAのリストは、REQUESTS_CA_BUNDLE環境変数を使用して指定することもできます。


26

最も簡単なのはREQUESTS_CA_BUNDLE、プライベート認証局または特定の証明書バンドルを指す変数をエクスポートすることです。コマンドラインでは、次のように実行できます。

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

あなたの認証局を持っている、あなたが入力したくない場合はexport、追加することができますたびにREQUESTS_CA_BUNDLE、あなたに~/.bash_profileのように続きます。

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile

環境変数は、PyCharmがOpenSSL証明書ファイルに保存されている証明書を処理するために必要なものでした。
ブレイディ

チェーンに自己署名証明書があります。このソリューションは、boto3ライブラリに関する私の問題を解決しました。
Ilkin

7

複数の証明書が必要な場合は、次のように解決されました。複数のルートpemファイルmyCert-A-Root.pemおよびmyCert-B-Root.pemをファイルに連結します。次に、リクエストREQUESTS_CA_BUNDLEvarを./。bash_profile内のそのファイルに設定します。

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile

それがその日の私の「ああ」の瞬間でした...どうもありがとう...このヒントで私は自己署名のjira証明書を機能させました... ;-)これを説明するサイトと回答が何百もあることを私は知っていますあなたは私のprobelmを解決する手助けのための私のクレジットを取得するので、私は、あなたを見つけた... D
alexrjs

4

設定export SSL_CERT_FILE=/path/file.crtは仕事をする必要があります。


ありがとう。私にとってはうまくいきREQUESTS_CA_BUNDLEます(私の場合、変数は効果がありません)。
パスカル

0

httplib2にCA(私の場合はCharles Proxy)を追加しようとしている人が(私がしたように)ここにたまたま着陸した場合cacerts.txt、Pythonパッケージに含まれているファイルに追加できるようです。

例えば:

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

他のソリューションで参照されている環境変数はリクエスト固有であるように見え、私のテストではhttplib2によって取得されませんでした。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.