Pythonを使用していると、特にmacOSでよく遭遇するエラーの一つにssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
があります。このエラーは、PythonがSSL接続を行う際に証明書の検証に失敗したことを示しています。
原因
Python 3.6以降のmacOSでは、Pythonはシステムの証明書ストアを使用せずにOpenSSLの組み込みバージョンを使用します。そのため、公式のPythonパッケージインストーラからPythonをインストールした場合、内部バージョンのOpenSSLを使用し、ルート証明書が含まれていません。
解決策
証明書のインストール
Pythonのインストーラを実行すると、この情報が表示されます。また、/Applications/Python 3.6/ReadMe.rtf
にも記載されていますが、見落とされやすいです。Applications/Python 3.6
に移動し、Install Certificates.command
をダブルクリックすることで証明書をインストールできます。
プロキシ環境下での対処法
プロキシを介して通信を行う場合、プロキシサーバーの証明書を検証する必要があります。プロキシサーバーは組織内でのみ使用されるため、自己署名証明書(上位の認証局が自分自身)が含まれている場合があります。自己署名証明書は信頼できない証明書(=クライアント側で元々信頼すると設定していない証明書)であるため、SSLErrorが発生します。
解決策としては、証明書の検証を行わない設定にするか、プロキシサーバーの証明書をクライアント側で設定する方法があります。ただし、証明書の検証を行わない設定はセキュリティ的に問題があるため、手元の検証作業などの時にのみ使用することをお勧めします。
以上が、Pythonで発生するSSL証明書検証エラーの原因と対処法になります。この情報が皆さんの問題解決の一助となれば幸いです。