438

I'm working on a simple script that involves CAS, jspring security check, redirection, etc. I would like to use Kenneth Reitz's python requests because it's a great piece of work! However, CAS requires getting validated via SSL so I have to get past that step first. I don't know what Python requests is wanting? Where is this SSL certificate supposed to reside?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
4

26 に答える 26

595

あなたが抱えている問題は、信頼されていない SSL 証明書が原因です。

前のコメントで言及された @dirk のように、最も簡単な修正は設定verify=Falseです:

requests.get('https://example.com', verify=False)

これにより、証明書が検証されないことに注意してください。これにより、アプリケーションが中間者攻撃などのセキュリティ リスクにさらされることになります。

もちろん、判断を適用します。コメントで述べたように、これはクイック/使い捨てのアプリケーション/スクリプトには受け入れられるかもしれませんが、実際には本番ソフトウェアに行くべきではありません

特定のコンテキストで証明書チェックをスキップするだけでは受け入れられない場合は、次のオプションを検討してください。最適なオプションは、verifyパラメーターを証明書のファイルのパスである文字列に設定する.pemことです (これは、何らかの安全な方法で取得する必要があります)。意味)。

したがって、バージョン 2.0 の時点で、verifyパラメーターはそれぞれのセマンティクスで次の値を受け入れます。

  • True: ライブラリ自体の信頼できる認証局に対して証明書を検証します (注: ルート証明書リクエストが使用するのは、リクエストから抽出された RC の信頼データベースである Certifi ライブラリを介して確認できます: Certifi - Trust Database for Humans )。
  • False: 証明書の検証を完全にバイパスします。
  • 証明書の検証に使用する要求の CA_BUNDLE ファイルへのパス。

ソース:リクエスト - SSL 証明書の検証

cert同じリンクのパラメーターも見てください。

于 2012-10-12T18:19:07.240 に答える
124

SSL検証に関するリクエストドキュメントから:

リクエストは、Web ブラウザーと同様に、HTTPS リクエストの SSL 証明書を検証できます。ホストの SSL 証明書を確認するには、verify 引数を使用できます。

>>> requests.get('https://kennethreitz.com', verify=True)

SSL 証明書を検証したくない場合は、verify=False

于 2012-05-19T19:20:07.677 に答える
59

使用する CA ファイルの名前は、次の方法で渡すことができますverify

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

使用する場合は、サーバー証明書に署名した CA を持たない可能性のある独自の CA セットを使用しますverify=Truerequests

于 2012-10-12T18:38:46.953 に答える
53

aws boto3 を使用しているときに同じ問題と ssl 証明書の検証に失敗した問題が発生しましたREQUESTS_CA_BUNDLE

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

aws-cli の場合、REQUESTS_CA_BUNDLE を設定するとこの問題が修正されると思います~/.bashrc(aws-cli がなくても動作するため、テストされていません)。

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
于 2015-11-15T07:47:16.803 に答える
17

警告を削除したい場合は、以下のコードを使用してください。

import urllib3

urllib3.disable_warnings()

およびorメソッドverify=Falseを使用request.getpost

于 2015-11-03T07:42:57.610 に答える
15

gspread を使用して同じ問題に直面し、これらのコマンドが機能します。

sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28
于 2016-02-16T04:53:27.560 に答える
5

パーティーには遅すぎると思いますが、私のような仲間の放浪者のために修正を貼り付けたかったのです! したがって、Python 3.7.xで次のことがうまくいきました

ターミナルに次のように入力します

pip install --upgrade certifi      # hold your breath..

スクリプト/リクエストを再度実行して、動作するかどうかを確認してください (まだ修正されていないはずです!)。うまくいかない場合は、ターミナルで次のコマンドを直接実行してみてください

open /Applications/Python\ 3.6/Install\ Certificates.command  # please replace 3.6 here with your suitable python version
于 2018-11-29T11:32:11.540 に答える
4

これは @rafael-almeida の回答に似ていますが、リクエスト 2.11+ の時点で、verify取得できる値は 3 つではなく、実際には 4 つあることを指摘したいと思います。

  • True: リクエストの内部の信頼できる CA に対して検証します。
  • False: 証明書の検証を完全にバイパスします。(非推奨)
  • CA_BUNDLE ファイルへのパス。リクエストはこれを使用してサーバーの証明書を検証します。
  • 公開証明書ファイルを含むディレクトリへのパス。リクエストはこれを使用してサーバーの証明書を検証します。

私の答えの残りは、証明書を含むディレクトリを使用して検証する方法についてです。

必要な公開証明書を取得し、ディレクトリに配置します。

厳密に言えば、帯域外の方法を使用して証明書を取得する必要がありますが、任意のブラウザーを使用して証明書をダウンロードすることもできます。

サーバーが証明書チェーンを使用している場合は、チェーン内のすべての証明書を取得してください。

要求のドキュメントによると、証明書を含むディレクトリは、最初に「再ハッシュ」ユーティリティ ( openssl rehash) で処理する必要があります。

(これには openssl 1.1.1+ が必要であり、すべての Windows openssl 実装が rehash をサポートしているわけではありません。うまくいかない場合は、 https://github.com/ruby/openssl/blob/masteropenssl rehashで rehash ruby​​ スクリプトを実行してみてください。 /sample/c_rehash.rb、私はこれを試していません。)

証明書を認識するためのリクエストを取得するのに問題がありましたが、openssl x509 -outform PEMコマンドを使用して証明書を Base64.pem形式に変換した後、すべてが完全に機能しました。

遅延再ハッシュを行うこともできます。

try:
    # As long as the certificates in the certs directory are in the OS's certificate store, `verify=True` is fine.
    return requests.get(url, auth=auth, verify=True)
except requests.exceptions.SSLError:
    subprocess.run(f"openssl rehash -compat -v my_certs_dir", shell=True, check=True)
    return requests.get(url, auth=auth, verify="my_certs_dir")
于 2019-10-10T20:44:41.260 に答える
3

私はHOURSのためにこの問題と戦った。

リクエストを更新しようとしました。次に、証明書を更新しました。verify を certifi.where() に指定しました(コードはデフォルトでこれを行います)。何も機能しませんでした。

最後に、python のバージョンを python 2.7.11 に更新しました。私はPython 2.7.5を使用していましたが、証明書の検証方法と互換性がありませんでした。Python (およびその他のいくつかの依存関係) を更新すると、動作し始めました。

于 2016-05-06T21:13:57.057 に答える
0

リクエストが別のパッケージから呼び出されている場合、オプションを追加することはできません。その場合、証明書を cacert バンドルに追加するのがストレート パスです。たとえば、「StartCom Class 1 Primary Intermediate Server CA」を追加する必要があり、ルート証明書を StartComClass1.pem にダウンロードしました。私の virtualenv の名前が caldav の場合、次の証明書を追加しました。

cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem
cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem

それらの1つで十分かもしれません、私はチェックしませんでした

于 2015-08-03T17:29:21.867 に答える
0

私は同様または同じ認証検証の問題を抱えていました。リクエストが依存する OpenSSL バージョン 1.0.2 未満では、強力な証明書の検証に問題が発生する場合があることを読みました (こちらを参照)。CentOS 7 は、問題があると思われる 1.0.1e を使用しているようです。

CentOS でこの問題を回避する方法がわからなかったので、より弱い 1024 ビット CA 証明書を許可することにしました。

import certifi # This should be already installed as a dependency of 'requests'
requests.get("https://example.com", verify=certifi.old_where())
于 2017-07-11T13:26:59.380 に答える