こんにちはフロントエンドエンジニアのまさにょんです!
今回は、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特化・無料)
参考・引用
- requestsでAPIコールする際にSSL: CERTIFICATE_VERIFY_FAILEDが出ても、認証を切らない対処法
- 【Python】[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123) エラー