首页 > 解决方案 > Python 文档文章“安全注意事项”关于 `smtplib` 的 SSL 上下文

问题描述

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)

(...)上下文,也是可选的,可以包含SSLContext并允许配置安全连接的各个方面。请阅读安全注意事项以了解最佳做法。


2. 安全注意事项文章

因此,请阅读上面提到的安全注意事项

(...) 强烈建议您使用该create_default_context()函数来创建 SSL 上下文。

(...) 如果您通过SSLContext自己调用构造函数来创建 SSL 上下文,则默认情况下它不会启用证书验证或主机名检查。

所以看起来我肯定想要前者:create_default_context对于 SSL 上下文。


3.smtplib.py

如果我省略了以下参数,我快速smtplib.py浏览了一下会发生什么:contextsmtplib.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()

足够的?为什么?

太感谢了 :-)

标签: pythonpython-3.xsslsmtplib

解决方案


最佳做法是使用server = smtplib.SMTP_SSL(context=ssl.create_default_context()).

根据文档字符串,由于向后兼容性,_create_stdlib_context限制较少。create_default_context

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


推荐阅读