Ошибка SSL-сертификата в SMTP-приложении Django DRF [дубликат]
У меня есть серверная часть Django DRF, которая работает нормально при использовании EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
.
Но затем, переключившись на SMTP, поддерживаемый Google, как:
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = config("GMAIL_APP_HOST_USER")
EMAIL_HOST_PASSWORD = config("GMAIL_APP_HOST_PASSWORD")
DEFAULT_FROM_EMAIL = "TestApp"
ACCOUNT_EMAIL_SUBJECT_PREFIX = ""
Я получаю [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Basic Constraints of CA cert not marked critical
Это тестируется на ПК с Windows 11.
Подробная информация об ошибке с обратной трассировкой:
Попытки отладки и исправления: При попытке отладки я написал это в настройках
import smtplib
import ssl
import certifi
print(certifi.where())
context = ssl.create_default_context(cafile=certifi.where())
print(context)
Это выводит:
C:\dev\myProject\venv\Lib\site-packages\certifi\cacert.pem
<ssl.SSLContext object at 0x0000024ACAE360D0>
И в строке server.starttls(context=context)
это вызывает ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1032)
Также пробовал (но получаю ту же ошибку) изменить серверную часть электронной почты на пользовательскую следующим образом:
class EmailBackend(SMTPBackend):
@cached_property
def ssl_context(self):
if self.ssl_certfile or self.ssl_keyfile:
ssl_context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_CLIENT)
# set verify location:
if hasattr(django_settings, 'CA_PATH') and django_settings.CA_PATH is not None:
ssl_context.load_verify_locations(capath=django_settings.CA_PATH)
ssl_context.load_cert_chain(self.ssl_certfile, self.ssl_keyfile)
return ssl_context
else:
ssl_context = ssl.create_default_context()
return ssl_context