Python docs статья "Вопросы безопасности" о контексте SSL с `smtplib` - PullRequest
0 голосов
/ 01 декабря 2018

1.smtplib.SMTP_SSL

В Python 3 Docs на smtplib.SMTP_SSL написано:

class smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None, [timeout, ]context=None, source_address=None)

(...) context, также необязательно, может содержать SSLContext и позволяет настраивать различные аспекты безопасного соединения.Пожалуйста, прочитайте Рекомендации по безопасности для получения рекомендаций.


2.Статья по соображениям безопасности

Прочтите вышеупомянутое Соображения по безопасности , где написано:

(...) Настоятельно рекомендуется использовать create_default_context() функция для создания контекста SSL.

и

(...) если вы создадите контекст SSL, вызвав конструктор SSLContext, он не будетпо умолчанию проверка сертификата или проверка имени хоста включены.

Так что, похоже, я определенно хочу первое: create_default_context для контекста SSL.


3.smtplib.py

Я быстро взглянул на smtplib.py, чтобы увидеть, что произойдет, если я опущу аргумент context smtplib.SMTP_SSL:

if context is None: context = ssl._create_stdlib_context(certfile=certfile, keyfile=keyfile)

Итак, есть звонок на ssl._create_stdlib_context, который, кажется, отличается от рекомендуемого ssl.create_default_context из статьи о безопасности.


4.ssl.py

В строке документации функции в ssl.py Я нашел:

All Python stdlib modules shall use this function to create SSLContext objects in order to keep common settings in one place. The configuration is less restrict than create_default_context()'s to increase backward compatibility.


5.Вопрос

Как мне позвонить smtplib.SMTP_SSL в соответствии со статьей о безопасности?Похоже, мне действительно нужно «вручную» вызывать create_default_context, чтобы каждый раз создавать контекст?

server = smtplib.SMTP_SSL(context=ssl.create_default_context())

Или

server = smtplib.SMTP_SSL()

достаточно?И почему?

Большое вам спасибо: -)

1 Ответ

0 голосов
/ 01 декабря 2018

Рекомендуется использовать server = smtplib.SMTP_SSL(context=ssl.create_default_context()).

В соответствии с строкой документации, _create_stdlib_context менее ограничен, чем create_default_context из-за обратной совместимости.

ref: https://github.com/python/cpython/blob/master/Lib/ssl.py#L581

...