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

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

関連記事

CelonisとSlackを連携する方法(例と設定手順のご紹介)

  <目次> (1) CelonisとSlackを連携する方法(例と設定手順のご紹介)  (1-1) 連携の概要  (1-2) STEP1:Slackコネクションの設定  (1-3) STE …

CRUD図とは?の例や書き方のご紹介

  <目次> (1) CRUD図とは?の例や書き方のご紹介  (1-1) CRUD図とは?  (1-2) CRUD図の例&書き方  (1-3) なぜCRUD図を作るか? (1) CRUD図と …

アジャイル開発のスクラム手法の流れや進め方について

  <目次> (1) アジャイル開発のスクラム手法の流れや進め方について  (1-1) スクラムとは?  (1-2) スクラムの流れ  (1-3) スクラムにおける「バックログ」の単位につい …

SlackとBacklogの連携手順(まずは疎通としてBacklogのステータス更新でSlack通知する)

  <目次> (1) SlackとBacklogの連携手順(まずは疎通としてBacklogのステータス更新でSlack通知する)  (1-1) SlackとBacklogの連携概要  (1- …

CORBA通信とは?概要やアーキテクチャについて

  <目次> (1) CORBA通信とは?概要やアーキテクチャについて  (1-1) CORBA通信とは?  (1-2) CORBAのアーキテクチャについて (1) CORBA通信とは?概要 …

  • English (United States)
  • 日本語
Top