什么可能导致“dh key 太小”错误?

yoo*_*oon 2 ssl openssl

我编写了一个使用 openssl 的程序,并对其进行了 dockerized。

但是当我用 python:3.7 基本图像尝试它时,出现了以下错误:

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

我设法通过降低/etc/ssl/openssl.cnf文件中的安全级别来解决这个问题。

echo "CipherString=DEFAULT@SECLEVEL=1" >> /etc/ssl/openssl.cnf

但是这个错误到底是什么意思?

这是一个服务器端问题,我无法在我的代码中处理吗?

我只是觉得通过降低安全级别来解决问题不太舒服。

更改该安全级别时应该考虑什么?

谢谢 :)

Pat*_*zek 5

我找到的最好的解释是在 Debian wiki 上的https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1,它说:

在 Debian 中,默认设置为更安全的值。这是在 /etc/ssl/openssl.cnf 配置文件中完成的。文件末尾有:

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2
Run Code Online (Sandbox Code Playgroud)

这可能会导致错误,例如:

dh key too small
ee key too small
ca md too weak
Run Code Online (Sandbox Code Playgroud)

这是由 SECLEVEL 2 将安全级别设置为 112 位引起的。这意味着 RSA 和 DHE 密钥需要至少 2048 位长。证书中的签名不再支持 SHA-1,您至少需要 SHA-256。请注意,CA 已于 2015 年 1 月停止颁发不符合这些要求的证书,自 2017 年 1 月以来,所有有效的 CA 证书都应符合这些要求。但是,私有 CA 生成的证书或测试套件中的证书不符合这些要求。

SECLEVEL 1 是以前版本中的默认值,处于 80 位安全级别,需要 1024 位 RSA 密钥。

“dh key 太简单”的问题在https://weakdh.org/ 上 有详细的说明:

Diffie-Hellman 密钥交换是一种流行的加密算法,它允许 Internet 协议就共享密钥达成一致并协商安全连接。它是许多协议的基础,包括 HTTPS、SSH、IPsec、SMTPS 和依赖 TLS 的协议。

我们发现了如何部署 Diffie-Hellman 密钥交换的几个弱点:

[..]

我该怎么办?如果您运行服务器...

如果您有 Web 或邮件服务器,则应禁用对导出密码套件的支持并使用 2048 位 Diffie-Hellman 组。

该怎么办?

尽量不要改变 SECLEVEL。最好在系统范围内保持原样 (SECLEVEL=2),但尝试修复您遇到的特定连接问题。

第一步是联系您尝试通过 TLS 连接的服务的管理员,并提供上面的详细信息,以便他进行必要的更改,不再存在“弱 dh”漏洞。

如果证明这是不可能的,或者在解决之前的平均时间,只需将连接的“SSL”密码设置为DEFAULT@SECLEVEL=1. 不幸的是,这降低了安全性,但至少它只影响这个特定的连接而不是你的整个系统。您不需要对密码列表进行硬编码,上面的值将使事情像以前一样工作。

我遇到了完全相同的问题并以这种方式解决了它,因为它无法说服远程方更改其 TLS 服务器或提供至少使用 RSA 2048 位的证书。