24 小时后仍在计算 Diffie Hellman 参数

信息安全 linux diffie-hellman 打开VPN 树莓派 手臂
2021-08-13 07:27:04

我在 RaspberryPi 模型 B 上全新安装了 Arch Linux。我正在设置 OpenVPN 并使用easy-rsaOpenSSL 1.0.2d 来生成初始密钥和证书。一切都很好,直到我跑了./build-dh(脚本在这里)。我写这篇文章是 24 小时后。

我之前在其他设备和相同的 RaspberryPi 上配置了 OpenVPN,但在 Raspbian 下。而且我不记得这个命令花了这么长时间。上次我使用 2048 位密钥,大约花了一个小时。现在我正在尝试使用 4096 位密钥,并且已经超过一天了。事实上,距离我重新启动所有设置、启用 build-it 硬件随机数生成器并再次尝试已经过去了 12 个小时。但它仍在进行中。

cat /proc/sys/kernel/random/entropy_avail 返回 3000-3100 范围内的值。

有没有人有这方面的经验?如何检查它是否只是没有在循环中执行?

2个回答

如果openssl使用大量 CPU,则不会阻塞等待“熵”。OpenSSL 在这方面实际上是理智的,它使用加密安全的 PRNG将初始种子扩展到所需的尽可能多的位。

使用时dhparam,OpenSSL 不仅会生成 DH 参数;它还想通过注意使用所谓的“强素数”作为模数来维护他的社会地位,这对安全性毫无用处,但需要更多的计算工作。“强素数”是一个素数p使得 ( p -1)/2 也是素数。素数生成算法如下所示:

  • 生成一个随机奇数p
  • 检验p是否为素数。如果没有,则循环。
  • 测试 ( p -1)/2 是否为素数。如果没有,则循环。

随机奇数 4096 位整数是素数的概率约为 1/2000,并且由于p和 ( p -1)/2 都必须是素数,因此平均需要生成和测试大约400 万个奇素数的素数。这势必需要一些时间。

从 2048 位到 4096 位时,强素数密度除以 4,素数测试也会慢 4 倍左右,所以如果生成 2048 位 DH 模数平均需要 1 小时,同样使用相同软件的机器将平均使用 16 小时来获得 4096 位 DH 模数。这只是平均值每一代都可能更快或更慢,这取决于你的运气。


合理的解决方案是添加-dsaparam选项。

openssl dhparam -dsaparam -out /etc/ssl/private/dhparam.pem 4096

此选项指示 OpenSSL 生成“类似 DSA”的 DH 参数p使得p -1 是较小素数q的倍数,并且生成器具有乘法顺序q)。这要快得多,因为它不需要嵌套素数测试,因此只会生成和测试数千个而不是数百万个候选者。

据学术界所知,DH 的类似 DSA 的参数同样安全;使用“强素数”没有实际优势(该术语是传统的,实际上并不意味着一些额外的力量)。

同样,您也可以使用 2048 位模数,它已经非常远离“不能破坏它的区域”。4096 位模数将使 DH 计算变慢(这对 VPN 来说不是真正的问题;这些仅在连接开始时发生),但实际上不会提高安全性。

在某种程度上,4096 位模数可能会吸引审计员,但审计员不太可能对 Raspberry-Pi 印象深刻,反正它太便宜了。

当我需要为我正在使用的 Raspberry pi 邮件服务器上进行的鸽舍升级生成 .pem 时,我遇到了同样的问题。dovecot 文档推荐的命令参数似乎在 RPi 上一直占用,所以我在我的笔记本电脑上运行了推荐的命令,一台 2.5 GHz 四核 Intel Core i7,只用了不到半小时:

openssl dhparam 4096 > dh.pem

然后我使用 scp 将 .pem 传输到 RPi。