web-dev-qa-db-ja.com

Python SSLエラーのリクエスト-証明書の検証に失敗しました

このコード

import requests
requests.get("https://hcaidcs.phe.org.uk/WebPages/GeneralHomePage.aspx")

私にこのエラーを与えています

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

SSLについては事実上何も知りませんが、サイトの証明書をダウンロードし、verifyオプションを使用してそのファイルをポイントしようとしましたが、うまくいきませんでした。何か不足していますか?

9
Oliver

コメントですでに指摘したように、サイトには SSLLabsレポート からわかるように、SSLの実装が不適切です。問題に関するこのレポートの主な部分は次のとおりです。

このサーバーの証明書チェーンは不完全です。 Bを上限とするグレード.

これは、サーバーが証明書の検証に必要な完全な証明書チェーンを送信していないことを意味します。これは、検証時に不足している証明書を自分で追加する必要があることを意味します。このためには、欠落しているチェーン証明書のPEMを含める必要があります C = US、O = DigiCert Inc、OU = www.digicert.com、CN = DigiCert SHA2 High Assurance Server CA およびルートCA C = US、O = DigiCert Inc、OU = www.digicert.com、CN = DigiCert High Assurance EV Root CA info a file my_trust_store.pemそして、あなたは呼び出すことができます:

requests.get("https://...", verify='my_trust_store.pem')

...しかし、サイトの証明書をダウンロードし、検証オプションを使用してそのファイルをポイントしようとしました

これは通常のリーフ証明書では機能しません。 Python)のSSLスタックはOpenSSLに基づいており、OpenSSLは信頼ストア内の信頼できる認証局(つまりverifyで指定)のみを想定し、サーバー証明書はCA証明書ではないためトラストストアに追加するのに役立ちません。

14
Steffen Ullrich