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の研修の概要・受講方法・学習支援コンテンツについて

  <目次> (1) Celonisの研修の概要・受講方法・学習支援コンテンツについて  (1-1) Celonisの研修概要  (1-2) Celonisの研修の分類について  (1-3) …

ワークフローを簡単に作成できるツールとその手順をご紹介(Zapier導入)

  <目次> (1) ワークフローを簡単に作成できるツールとその手順をご紹介(Zapier導入)  (1-1) STEP1:Zapierのアカウント作成  (1-2) STEP2:Zapie …

C#でテキストファイルを読み込む方法(サンプルプログラム付き)

  <目次> (1) C#でテキストファイルを読み込む方法(サンプルプログラム付き)  (1-1) 構文  (1-2) 事前準備  (1-3) サンプルプログラム  (1-4) ご参考:使用 …

no image

Gremlinとは?セットアップとHello Worldまで

<目次> (1) Gremlinとは?セットアップとHello Worldまで  概要  (1-0) STEP0:前提条件  (1-1) STEP1:Gremlin Consoleのセットアップ  ( …

APIの難しい部分を吸収し、手軽に検証するためのツール(Postman)をご紹介

  <目次> (1) APIの難しい部分を吸収し、手軽に検証するためのツール(Postman)をご紹介  (1-1) Postmanの概要  (1-2) Postmanの導入手順  (1-3 …

  • English (United States)
  • 日本語
Top