Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

IT技術 (Technology)

SSLCertVerificationError [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificateエラーが出る原因と対処

投稿日:2023年5月8日 更新日:

 

<目次>

(1) SSLCertVerificationError [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificateエラーが出る原因と対処
 (1-1) エラー概要
 (1-2) 原因
 (1-3) 対処
 (1-4) 補足:「verify = False」は原則使用NG

(1) SSLCertVerificationError [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificateエラーが出る原因と対処

(1-1) エラー概要

PythonでAPIをコールした際に下記のエラーが発生しました。
(エラーメッセージ)

requests.exceptions.SSLError: HTTPSConnectionPool(host='demo.pleasanter.org', port=443): Max retries exceeded with url: /api/items/7185230/create (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)')))
(図211)

目次にもどる

(1-2) 原因

・ご自身の端末内の「信頼済みルートCA(認証局)ストア」にルート証明書が導入されていない可能性があります。
・Windowsの場合、Webページが新しい証明書を要求する場合に自動で更新してくれるが、Pythonスクリプトをローカル実行する場合は、ブラウザ経由と異なり証明書のアップデートを受領出来ず、上記のようなエラーが発生する可能性があります。

(1-3) 対処

ご自身の端末内の「信頼済みルートCA(認証局)ストア」に必要な証明書(のチェーン)を追記していきます。

●STEP1:必要な証明書のダウンロード

・①(Chromeの例)ブラウザの南京錠マークを押下し「この接続は保護されています」をクリック
(図231)
・②「証明書は有効です」を押下します
(図232)
・③証明書ビューアが開きます
(図233①)
 
(図233②)
・④右下の「エクスポート」を押下します。
(図234①)
.crt形式の証明書がダウンロードされます。
(図234②)
・⑤これを証明書チェーンの数だけ繰り返し実施します。
下記の例ですと、ルート証明書(権威ある信頼できる最終機関)に行き着くまでに3段階あるので、3つダウンロードします。
(図234③)

●STEP2:落とした証明書を端末の信頼済CA証明書に追加

・①下記コードでPythonで使う信頼済CA証明書のファイル(cacert.pem)を探します。
(サンプル)
import requests

def main():
    print(requests.certs.where())   

if __name__ == "__main__":
     main()
(図235①)

(結果例)
C:\Users\Rainbow\AppData\Roaming\Python\Python310\site-packages\certifi\cacert.pem
・②中を開くと、各CAの証明書がずらー-っと並んでいます。
→Pythonのローカルプログラムで証明書の確認する時は、このファイルを読んでいます。
(図235②)
・③今回ダウンロードした証明書を末尾に追加します。
テキストエディタ等でも、3つの証明書の内容を「cacert.pem」の末尾に追記します。
 
(図236)
※注意:証明書チェーンをすべて登録する必要があります
 

(1-4) 補足:「verify = False」は原則使用NG

SSLの機能を無効化しているため、セキュリティ的にNGです。
特に、下記のような「verify=False」による解決策を提示しているQAサイトなどは要注意です。
処理自体は通るかも知れませんが、暗号化していないため、万が一データを傍受された際に解読できてしまいます。
(NG例)
from urllib3.exceptions import InsecureRequestWarning
    # ~中略~
    requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
    response = requests.post(final_url, headers=headers, json=body, verify=False)
※暗号化の仕組みは下記の記事をご参照ください

Adsense審査用広告コード


Adsense審査用広告コード


-IT技術 (Technology)
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

hostsファイルとは?書き換えや反映の手順をご紹介(Windows編)

<目次> (1) hostsファイルとは?書き換えや反映の手順をご紹介(Windows編)  (1-1) hostsファイルとは?  (1-2) hostsファイルの主な用途  (1-3) hosts …

no image

Miroでプランを確認する方法

  <目次> (1) Miroでプランを確認する方法  (1-1) 確認方法  (1-2) 【注意点】基本的にプラン(≒Subscription)は「アカウント」ではなく「チーム」に紐づく …

Webスクレイピングとは?実施する際の注意事項について

  <目次> (1) Webスクレイピングとは?実施する際の注意事項について  (1-1) やりたいこと  (1-2) 概要  (1-3) スクレイピングをする上での注意事項  (1-4) …

Anaplanとは?コネクテッドプランニング(コンセプト)と絡めてご紹介

  <目次> (1) Anaplanとは?コネクテッドプランニング(コンセプト)と絡めてご紹介  (1-1) Anaplanとは?  (1-2) Anaplanで実現する「コネクテッドプラン …

AWSの始め方(アカウントの作成からPythonでS3バケット操作まで)

  <目次> (1) AWSの始め方(アカウントの作成からPythonでS3バケット操作まで)  (1-0) やりたいこと  (1-1) STEP1:AWSアカウントを作成する  (1-2) …

  • English (United States)
  • 日本語
Top