我每次都需要一个新的ssl.create_default_context()吗?

时间:2017-01-28 07:18:15

标签: python ssl

这是我使用SSL上下文的代码:

with smtplib.SMTP(host, port) as smtpserver:
    smtpserver.ehlo()
    smtpserver.starttls(context=ssl.create_default_context())
    ... etc ...

默认上下文对象是一个可以在多线程程序中共享和重用的常量吗?我的意思是只创造一次:

SSL_CONTEXT = ssl.create_default_context()

然后:

with smtplib.SMTP(host, port) as smtpserver:
    smtpserver.ehlo()
    smtpserver.starttls(context=SSL_CONTEXT)

发送的每条消息。

2 个答案:

答案 0 :(得分:1)

每个连接都应具有自己的上下文。您可以在http.client的Python源代码中看到HTTPSConnection为每个连接创建新的上下文。

https://github.com/python/cpython/blob/master/Lib/http/client.py

答案 1 :(得分:0)

确实ssl.create_default_context()可以在初始化之后再次使用(因为它的目的):

import ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> context = ssl.create_default_context()
>>> smtp.starttls(context=context)
  

(220,b'2.0.0准备启动TLS')

https://docs.python.org/3/library/ssl.html#best-defaults