【问题标题】:Python dh key too small, which side is faulty?Python dh key 太小,哪边有问题?
【发布时间】:2020-10-15 03:00:07
【问题描述】:

使用 Python 3,我尝试使用 SSL 上下文连接到远程 SMTP 主机,但出现以下错误:

[SSL: DH_KEY_TOO_SMALL] dh 密钥太小 (_ssl.c:1056)

这是我使用的代码:

from smtplib import SMTP
import ssl, os, certifi

ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=certifi.where())
ssl_context.options |= ssl.OP_NO_TLSv1
ssl_context.options |= ssl.OP_NO_TLSv1_1

ssl_context.load_cert_chain(os.path.join(certsdir, 'certificate.pem'), os.path.join(certsdir, 'id_rsa'))
ssl_context.load_dh_params(os.path.join(certsdir, 'dhparams.pem'))

ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE

smtp = SMTP(server_name)
smtp.connect((host, 25))
smtp.ehlo()
if smtp.has_extn('starttls'):
    smtp.starttls(None, None, ssl_context)
    smtp.ehlo()

smtp.mail(fromaddr)
smtp.rcpt(toaddr)
smtp.data(message)
smtp.quit()

问题:问题是在我端还是在目标服务器端?有什么办法可以避免这个问题吗?

我使用certifi 作为证书列表,它基于 Mozilla 的建议并且是最新的。

在这里感谢您的帮助。

【问题讨论】:

    标签: python-3.x ssl


    【解决方案1】:

    问题:问题是在我端还是在目标服务器端?

    服务器提供弱 DH 密钥,客户端(您的脚本)需要更强的密钥。该问题通常应在服务器端解决。请注意,您对load_dh_params 的调用毫无意义,因为设置 DH 密钥仅与服务器端相关。

    我可以做些什么来避免这个问题吗?

    首先不要使用 DH 密码。所有现代客户端都支持不存在此问题的 ECDHE 密码。反正DH很慢。 通常,如果提供,客户端也会选择 ECDHE 密码,并且不会发生此错误。虽然可能是客户端的 TLS 堆栈太旧并且更喜欢 DH,但这样的旧堆栈通常不会抱怨 DH 较弱。因此,服务器 SSL 堆栈很可能太旧,因此默认情况下它无法提供客户端想要的更现代的密码。

    为了确保客户端不提供 DH 密码,因此使用 ECDHE 或 RSA 密钥交换 set the ciphers

     ssl_context.set_ciphers('DEFAULT:!DH')
    

    请注意,尽管 RSA 密钥交换也被认为已过时,因为它不提供任何前向保密。因此,您可以尝试使用DEFAULT:!DH:!kRSA 的密码字符串,如果服务器可以在没有 DH 和 kRSA 的情况下运行。

    【讨论】:

    • 感谢您的回复!澄清一下,当您说“服务器提供的 DH 密钥较弱”时。是我,还是我要连接的服务器?至于从 DH 密码切换到 ECDHE,我该怎么办? (指向一个链接是完美的,你不必写一个广泛的解释:))
    • @CyrilN.:我实际上对您的 dhparam 设置以及您正在实现服务器感到有些困惑。但是你正在实现一个客户端并在那里设置 dhparam 是没有意义的。查看更新的答案。
    • 非常感谢您的回答。我还有其他一些与 SMTP、SSL、服务器/客户端相关的问题。我可以通过电子邮件与您联系吗? (我从你的网站获得了你的,但我更愿意先征求许可,因为这与这里的上下文无关,但与我们的知识领域完全相关)。提前谢谢!
    • 在这种情况下:如果不需要,我是否需要加载 dh 参数 (load_dh_params)?
    • @CyrilN.:我更喜欢公开问题,而不是通过邮件。这样大家就获利了。如果不需要,您不需要加载 DH 参数。并且无论是否使用 DH 密钥交换,客户端都绝对不需要这些。
    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多