[解決] Python3でエラー ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)

Djangoからメールを送信する際に、SMTP over SSL/TLSを使おうとしたところエラーが出ました。

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

開発で使用していたMacOSでも本番用のLinux上でも同様のエラーが出てしまいました。どうやらSSL(TLS)証明書の検証に失敗しメールの送信が出来ない状態のようです。

OSに依存する以外の方法を探していたところ、certifiというモジュールを使えば解決することが分かりました。

certifiをインストールします。

pip install certifi

Djangoであればsettings.py等に下記コードを追加します。

import certifi, os
os.environ['SSL_CERT_FILE'] = certifi.where()

これでcertifiが提供するルート証明書コレクションを使うことができるようになります。

certifi
https://github.com/certifi/python-certifi