1. ホーム
  2. python-3.x

[解決済み] Python SSL証明書検証エラー

2022-03-10 02:36:30

質問

RESTful APIにアクセスするためにrequestsを使用しています。 すべてうまくいっているように見えます。 私は認証し、セッショントークンを引き出し、私がAPI用に書いたクラスのメソッドをユニットテストすることさえできます。 そして、私は自分のコードを実行しようとしました。

まず、私が行っている呼び出しはこちらです。 ヘッダーはセッションに関連する静的な項目で イニット (). ボディは、ファイルのデータから動的に構築され、この関数に渡されます。 データはすべて有効です。

response = requests.post(url, headers=(Requestheader), data=json.dumps((Requestbody)))

このコードを実行すると、私が提供したメタデータで100をはるかに超えるレコードが更新されます。 150件目あたりで、次のようになります。

ssl.SSLCertVerificationError: [ssl: certificate_verify_failed] (証明書の検証失敗) 証明書の検証に失敗しました: 証明書内の自己署名証明書 チェーン (_ssl.c:1045)

私の最初のステップは、ベンダーに電話をして、すべてのウェブサーバーが適切に署名された証明書を持っているかどうかを確認することでした。 彼らはこのようなことはないと言っています。

それから、このメッセージをググってみたら、verify kwargというのがあることがわかったので、試してみたんです。

response = requests.post(url, headers=Requestheader, data=json.dumps(Requestbody), verify=False)

これは長期的には理想的ではないことは分かっていますが、動作が同じかどうかテストしてみたかったのです。 それは同じことをしました。 しばらく実行した後、sslエラーを投げました。 verify=Falseの考え方は、チェックしないことだと思ったのですが。

ベンダーから、使っているurlを確認するように言われましたが、大丈夫です。 もしプロキシサーバーや本当の中間者攻撃が問題を起こしているならば、失敗する前に何度も成功を見ることはないと思うのですが。 このような場合、「401」ステータスを投げる必要があり、私の活動レベルが高すぎるため、非活動時のタイムアウトが発生しているのではないかと考えました。

私はpythonの素人であり、セキュリティのプロではありません。 提案をお願いします。

どのように解決するのですか?

つまり、この問題には3つの解決策があると私は考えています。

  1. 証明書はOKで、コードに何か問題がある。で説明されているような準備されたリクエストを使用している時などに問題が発生する可能性があります。 この解決策

    しかし、あなたが提供したスニペットでは、そのようなメソッドは使用されていないため、あなたのケースとは思えません。次の2つのバリエーションについては、エラーを引き起こすURLを取得し、その証明書を調査する必要があります(ブラウザ経由で可能)。

  2. 証明書はOKだが、その証明書に署名した認証局が、requestsライブラリで利用するCAリストに含まれていない。問題のあるURLを開いたら、その中のCAを確認し、その日付が有効かどうか、また、そのCAが これ のリストで確認できます。もしそうでなければ、リクエストライブラリの信頼できるリストにCAを追加してください -- この質問への回答で説明しています。 StackOverflowの質問 .

  3. 証明書が有効でない、または自己署名されている。2と同じ解決方法です。

一般的な解決策は、スクリプトを try except 節を使用し、間違いが発生する URL をすべてプリントアウトします。そして、それらを一つずつリクエストライブラリ経由でリクエストしてみて、問題が発生するかどうかを確認します。発生した場合は、(2)または(3)のケースです。そうでない場合 - pythonとrequestsが新しくインストールされた別のマシンでスクリプトを実行してみてください。実行が成功するならば、あなたの設定に何らかの問題があるのです。