Python文档文章“;安全考虑”;关于带'smtplib'的SSL上下文` 1. smtplib.SMTP_SSL

Python文档文章“;安全考虑”;关于带'smtplib'的SSL上下文` 1. smtplib.SMTP_SSL,python,python-3.x,ssl,smtplib,Python,Python 3.x,Ssl,Smtplib,在Python 3文档中,它说: 类smtplib.SMTP\u SSL(主机=“”,端口=0,本地主机名=无,密钥文件=无,证书文件=无,[超时,]上下文=无,源地址=无) (…)上下文(也是可选的)可以包含并允许配置安全连接的各个方面。请阅读最佳实践 2.安全考虑条款 因此,请阅读上面提到的内容: (…)强烈建议您使用create_default_context()函数来创建SSL上下文 及 (…)如果您自己通过调用SSLContext构造函数来创建SSL上下文,默认情况下,它将不会启用证

在Python 3文档中,它说:

类smtplib.SMTP\u SSL(主机=“”,端口=0,本地主机名=无,密钥文件=无,证书文件=无,[超时,]上下文=无,源地址=无)

(…)上下文(也是可选的)可以包含并允许配置安全连接的各个方面。请阅读最佳实践


2.安全考虑条款 因此,请阅读上面提到的内容:

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

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

因此,似乎我确实想要前者:
create\u default\u context
用于SSL上下文


3. <代码>smtplib.py 如果省略
smtplib.SMTP\u SSL
context
参数,我快速查看了一下,看看会发生什么:

如果上下文为无:
context=ssl.\u创建\u stdlib\u上下文(certfile=certfile,
keyfile=keyfile)

因此需要调用
ssl.\u create\u stdlib\u context
,这似乎不同于安全注意事项文章中推荐的
ssl.create\u default\u context


4. <代码>ssl.py 在中的函数docstring中,我发现:

所有Python stdlib模块都应使用此函数创建SSLContext
对象,以便将公共设置保留在一个位置。配置
小于create_default_context()向后增加的限制
兼容性。


5.问题: 根据安全注意事项文章,我应该如何调用
smtplib.SMTP\u SSL
?似乎我真的需要“手动”调用
create\u default\u context
每次创建一个上下文

server = smtplib.SMTP_SSL(context=ssl.create_default_context())
或者是

够了吗?为什么


非常感谢:-)

最佳做法是使用
server=smtplib.SMTP\u SSL(context=SSL.create\u default\u context())

根据docstring,
\u create\u stdlib\u context
create\u default\u context
的限制更小,因为向后兼容


参考:

来自:
\u创建\u标准库\u上下文=\u创建\u未验证\u上下文
。是的,显然不太安全,因为默认上下文正在进行证书验证,而
\u create\u stdlib\u context
显然不安全。@Jayjayyy:只使用默认上下文就足够了。这将启用正确的证书验证,包括针对证书主题/SAN验证目标主机名。
server = smtplib.SMTP_SSL()