PythonでSSL証明書エラーが出た話と解決方法(社内プロキシ環境)

  • URLをコピーしました!

最近会社でPythonで外部APIを利用した開発をしているんですが、社内プロキシのせいでSSL証明書エラーが!


ですが、「certifi-win32」というライブラリを入れたら一発で治りました!

備忘録がてら、発生状況と対処方法を記事にしておきます。

にゃあこ

PyPIはこちら!↓

目次

自環境

  • OS:Windows
  • Python:Miniconda環境
  • ネットワーク:社内プロキシ環境(SSLインスペクションあり)
  • 使用API:Microsoft Graph API

また、APIデータの取得があるため、事前にライブラリ「requests」を入れていました。が、社内プロキシ環境下ではこいつだけでは無理だったようです。

エラー内容:[SSL: CERTIFICATE_VERIFY_FAILED]

エラー内容は下記の通りでした。

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)

このエラーは、SSL/TLS接続を確立する際に、ローカルの証明書ストアに信頼できる証明書が見つからない場合に発生します。

原因

社内ネットワークでは、HTTPS通信がプロキシを経由する際に通信内容の検査(SSLインスペクション)サーバ証明書の差し替えが行われます。

一方で、Pythonのrequestsは

  • certifi に含まれる独自のCAバンドルを使用
  • OS(Windows)の証明書ストアを参照しない

という特性があります。

このため、Windowsは社内証明書を信頼、Pythonは信頼しない、という齟齬が起きていたようです。

図解(ChatGPT作成)

python-certifi-win32をインストールで解決

ターミナルにこれを打つだけで解決です!

pip install python-certifi-win32

これによって、プロキシが差し替えた「社内CA証明書」を、Python側が信頼してくれるようになります。

補足

ちなみにこのライブラリはwindowsにしか適用してません。

Macの場合は、環境変数で社内CA証明書を直接指定して解決できると思います。

set REQUESTS_CA_BUNDLE=(社内CA証明書のパス)

本記事の内容は検証・学習用途を想定したものです。実際の環境で適用する際は、所属組織のセキュリティポリシーおよび運用ルールに従ってください。
本記事の内容を利用したことにより生じたいかなる損害についても、当方は責任を負いかねます。

よかったらシェアしてね!
  • URLをコピーしました!
目次