Pythonで ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate エラーの解決方法

SSLCertVerification

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、Pythonで ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate エラーの解決方法について解説します。

ssl.SSLCertVerificationError の発生状況とエラーの内容

まずは、ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate エラーが発生した状況について説明します。

ssl.SSLCertVerificationError が発生したSrcCode

自作のLaravel-APIに、Python-Scriptで通信を実施しようとしたところ上記のエラーが発生しました。

import requests

import pprint

POST_URL = 'https://robotama/api/posgre/m_dataset'

request_body = {"classification_id": 1}

# APIにデータをPostして、レスポンスを取得する処理
response = requests.post(POST_URL, json=request_body)

# JSON形式でレスポンスボディを取得
json_data = response.json()

ssl.SSLCertVerificationError の内容

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:997)

Google翻訳では、次のように翻訳されました。

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 証明書の検証に失敗しました: 自己署名証明書 (_ssl.c:997)

Certificate や Cert は「証明書」という英単語で、Verification は「検証」という英単語です。

SSLCertVerificationErrorは、直訳すると「SSL証明書の検証エラー」になります。

ちなみに、SSL(Secure Sockets Layer)とは、Webサイトとそのサイトを閲覧しているユーザとのやり取り(通信)を暗号化するための仕組み(プロトコル)です。

ssl.SSLCertVerificationError の解決方法

上記のエラーは、エラーが示すとおりSSLに関するエラーです。

requests モジュールで「https://」で始まるURLに対してリクエストを実施する際に、SSL証明書(オレオレ証明書)の検証ができないとエラーになります。

解決策-1: verify=False を requests のメソッドの引数に設定する

requests.get()requests.post() の引数に verify=False を設定すると、

SSL証明書の確認を無視するようになり、ssl.SSLCertVerificationError が発生しなくなります。

開発環境や、イントラネットなどの環境だったら、これで特に問題ないです。

import requests

import pprint

POST_URL = 'https://robotama/api/posgre/m_dataset'

request_body = {"classification_id": 1}

# verify=False を引数に設定する!
response = requests.post(POST_URL, json=request_body, verify=False)

# JSON形式でレスポンスボディを取得
json_data = response.json()

# 無事にデータを取得ができるようになりました!
pprint.pprint(json_data) # [{'name': 'Robotama-DataSet'}] 

classification_name = json_data[0]['name']

pprint.pprint(classification_name) # 'Robotama-DataSet'

解決策-2: verifyにSSL証明書までのファイルPathを渡す

あたりまえですが、SSL証明書の確認が必要でエラーがでているので、

verifyにSSL証明書までのファイルPathを渡して確認できるようにすれば、エラーは解決します。

こちらに詳細が詳しく記述されています。

requestsでAPIコールする際にSSL: CERTIFICATE_VERIFY_FAILEDが出ても、認証を切らない対処法

response = requests.post(POST_URL, json=request_body, verify='/etc/ssl/certs')

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

Python関係書籍

プログラミング学習・エンジニア転職関連の情報

自宅で現役エンジニアから学べる『TechAcademy』 (エンジニア転職保証)

『GEEK JOBキャンプ』スピード転職コース(無料)

【IT道場】入校時0円! 就職目的プログラミングスクール

エンジニア転職なら100%「自社開発」求人に強い【クラウドリンク】

『techgym』 (Python特化・無料)

参考・引用

  1. requestsでAPIコールする際にSSL: CERTIFICATE_VERIFY_FAILEDが出ても、認証を切らない対処法
  2. 【Python】[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123) エラー

最近の投稿