有人可以解释通过生成 DH 参数到底完成了什么吗?

信息安全 tls AES openssl rc4 diffie-hellman
2021-09-02 20:35:17

我正在设置一个 node.js 服务器:

https.createServer({
    ...
    ciphers: 'ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH',
    honorCipherOrder: true
}, app).listen(443);

这是一个能够达到 SSLLabs A 评级的,这很好。现在,握手模拟中的所有协商似乎都是使用TLS_RSA_WITH_RC4_128_SHA.

RC4 对 BEAST 具有弹性。如果我们容易受到 BEAST 的攻击,我们将无法获得 A 评级。

如果客户支持,我想支持 PFS(前向保密)。

根据我的阅读,我“必须通过生成 Diffie-Hellman 参数来生成一些随机性”,并以某种方式将其放入我的证书中,然后服务器才能正确实施 ECDHE 以实现前向保密。我在某处读到 ECDHE 的 CPU 密集度低于 DHE,所以这是一个优点。

好吧,我有很多问题。但我会问第一个:

为什么我必须生成“一些随机性”来附加到证书,它的用途是什么,以及该命令的实际作用是什么?dhparam 上的 OpenSSL 页面并没有告诉我很多关于它的实际作用。

我已经看到了这个答案,并且正在寻找更清晰的解释(或至少参考相关阅读!)。

根据OpenSSL Ciphers,ECDHE 似乎是 TLS 1.2 密码。Qualys 的 PFS 页面上,它说所有主要的现代浏览器都支持 ECDHE,但我在通过 TLS1.2 连接的 SSLLabs 测试的结果中只看到 iOS6。我想我可以对“握手模拟”部分持保留态度。

另一个问题是,如果我将条目保留在密码列表中,为什么 SSLLabs 的评分为 A HIGH:这将使服务器支持连接TLS_RSA_WITH_AES_128_CBC_SHA,例如(报告显示同样多),这很容易受到 BEAST 的攻击!也许是因为它从未使用报告不支持 RC4 的“客户端”进行测试。

还有一个问题:在 OpenSSL 密码页面上,TLS 1.2 密码套件下的列表包括:

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256     ECDHE-RSA-AES128-SHA256

这是否表明如果我确实将它与 ECDHE 连接,由于使用 CBC 而现在也容易受到 BEAST 的影响?例如,我应该像谷歌那样切换它:ECDHE with RC4。但是密码页面不包含任何看起来像 ECDHE-RSA-RC4-SHA 的东西。然而,有一个 ECDHE-ECDSA-RC4-SHA。这有什么不同?编辑:这个 SO answer提到 ECDSA 与 RSA 是分开的。我想复制 Google 对 ECDHE_RSA+RC4+SHA 所做的事情,因为这似乎是性能和安全性的完美结合。

更多注释(如果我误解了一些事情,请告诉我,尤其是伪装成问题的陈述):

BEAST 弹性通过选择对称密码(RC4 与 AES 等)来控制。许多客户端不支持不使用 CBC 的 AES 模式?所以我们应该完全避免AES......?PFS 可以通过使用 Diffie-Hellman 密钥交换来获得,并且只有包含DHEECDHE满足这一点的模式。只有 OpenSSL 支持完美的前向保密。RC4 比 AES 快。RC4 比 AES 好(因为 BEAST)?

另一个编辑:让我们看看......表明 BEAST 并不是现实地关注的事情,尽管它会对 SSLLabs 评级产生负面影响。那个大“A”看起来真好……让我们看看……我可能仍然应该将 RC4_128 密码放在密码链的开头,如果没有其他原因,它们没有被证明是“坏的”,并且是通常比 AES 快。无论如何,我已经偏离了最初的主题,即 ECDHE。以及如何让 DH 参数与 Node/Express 一起正常工作?

4个回答

SSL 中基于 RSA 的传统交换很好,因为使用非对称加密生成和传输随机会话密钥,因此只有私钥的所有者才能读取它。这意味着任何人都无法解密对话,除非他们拥有证书的私钥。但是如果第三方保存了加密的流量并最终获得了私钥,他可以用它来解密来自 SSL 交换的会话密钥,然后用它来解密整个会话。所以这不是完美的前向保密。

完美前向保密的关键是Diffie-Hellman 密钥交换DH 是一种非常酷的算法,用于在两方之间生成共享密钥,因此看到一切的观察者- 两方之间的整个交换 - 无法仅从通过线路发送的内容中获取密钥。派生的密钥只使用一次,永远不会存储,永远不会传输,并且永远不会被任何人再次驱动。换句话说,完美的前向保密。

单独的 DH 无法保护您,因为没有身份和身份验证,玩中间人是微不足道的。因此,您可以继续使用 RSA 进行身份验证,只需使用 Diffie-Hellman 生成会话密钥。那就是DHE-RSA-*,例如:DHE-RSA-AES128-SHA1是一个密码规范,它使用 Diffie-Hellman 生成密钥,RSA 用于身份验证,AES-128 用于加密,SHA1 用于摘要。

但 Diffie-Hellman 需要一些设置参数才能开始。这些不是秘密,可以重复使用;加上它们需要几秒钟才能生成。但它们应该是“干净的”,由您生成,因此您知道它们不是由攻击者提供的。dhparam步骤会提前生成 DH 参数(通常只是一个大素数),然后将其存储以供服务器使用。

最近的一些研究表明,虽然“破坏”DH 交换(即从流量中获取密钥)很困难,但可以仅根据素数提前完成相当多的困难工作。这意味着,如果在任何地方都使用相同的 DH 素数,它们就会成为资金充足的机构进行计算的“主要”目标。这表明在生成您自己的素数(而不是依赖于您的软件附带的素数)以及定期重新生成这些素数时,可以提高一定程度的安全性。

有趣的是,椭圆曲线 Diffie-Hellman是一种改进的 Diffie-Hellman 交换,它使用椭圆曲线加密而不是传统的 RSA 风格的大素数。所以虽然我不确定它可能需要什么参数(如果有的话),但我认为它不需要你生成的那种。

也可以看看:

关于 BEAST
BEAST 攻击依赖于在旧版本 SSL 上与 AES 一起使用的块链接方法的一些工件。较新版本的 SSL 做事正确,所以不用担心。RC4 不是分组密码,因此没有分组链接。BEAST 攻击非常难以实施,以至于它对现实世界的影响绝对不存在。事实上,RC4 也有其自身的一些弱点,尤其是当被滥用 BEAST 攻击的方式时。因此,您实际上可能没有获得更好的安全性。

当然,强制 TLS 1.2 可以解决您所有理论上的安全问题,同时阻止许多访问者实际连接。与使用 ECDHE 并不完全不同。

在“DHE”密码套件中,服务器即时生成新的Diffie-Hellman密钥对,使用其 RSA 或 DSA 或 ECDSA 私钥签署公钥,并将其发送给客户端。DH 密钥是“临时的”,这意味着服务器永远不会将其存储在其磁盘上;它在 SSL 握手期间将其保存在 RAM 中,然后完全忘记它。永不存储,事后不能被盗,这就是PFS的由来。请注意,这个DH业务从不输入证书:服务器证书包含服务器的永久公钥,类型为RSA或DSA或ECDSA,仅用于签名。

通常,Diffie-Hellman 是一种在有限群中计算的算法,其中计算很容易,但离散对数很难。在“普通”DH 中,群由一些以大素数p为模的整数组成,乘法是群定律。DH 参数是该组的定义,即大素数p和常规生成器g为了安全起见,对多个密钥对重复使用相同的参数没有问题,包括使用与其他人相同的 DH 参数。需要的是参数是“公平的”,即素数p 是随机生成的,并且没有经过特殊设计以使离散对数容易模该素数。

生成您自己的 DH 参数是一种“确保”您正确使用随机 DH 参数的方法。不过,它比科学更具仪式性:SSL 服务器库应该带有默认的 DH 参数,这些参数很好,并且根据定义,您已经相信 SSL 库不会对您玩讨厌的把戏。

ECDHE遵循相同的路线,只是它在另一组中应用 DH,即椭圆曲线椭圆曲线有一些计算上的好处,但还没有得到广泛的支持。生成您自己的 DH 参数的模拟将是选择您自己的随机曲线。实际上没有人这样做,因为:

  • 生成具有适当特征的随机曲线是一项复杂且昂贵的工作。
  • 椭圆曲线的计算优势部分来自为特定曲线优化的双方(客户端和服务器)。生成你自己的随机曲线会打败它。

至于BEAST,不用太担心。这是对客户端的攻击,而不是对服务器的攻击,现代客户端包括变通方法(特别是“1/n-1 拆分”)。这是一个很好的攻击,但它不再起作用了。服务器对此唯一能做的就是强制一个不知情的旧客户端使用 RC4(在构造上不易受到攻击)。

请注意,BEAST 仅适用于 SSL 3.0 和 TLS 1.0。使用 TLS 1.1 和 1.2,BEAST 根本不起作用,即使对称密码是 CBC 模式下的分组密码。

NSA 对 RSA 的攻击弄乱了 PRNG(随机数的东西)。可以肯定的是,这不是他们唯一搞砸的 PRNG。这是一个可能值得研究的非美国基于硬件的随机生成器:http ://www.entropykey.co.uk/

RC4 对 BEAST 具有弹性。

确实,使用流密码可以避免 BEAST 和 POODLE,但是 RC4 有它自己的问题。密钥流具有可能泄露信息的已知偏差。

在 Beast 被发现之后的一段时间内,RC4 被短暂推荐过,但在人们意识到 RC4 中的密钥流偏差问题有多严重之前。

如果我们容易受到 BEAST 的攻击,我们将无法获得 A 评级。

这可能在某一时刻是正确的,现在不再是。

qualys 人认为野兽比 RC4 更邪恶。

为什么我必须生成“一些随机性”来附加到证书,它的用途是什么,以及该命令的实际作用是什么?dhparam 上的 OpenSSL 页面并没有告诉我很多关于它的实际作用。

dhparam 生成用于传统 diffie-hellman(不是 ECDH)的参数。这些参数不是秘密的,但为了使 DH 安全,它们必须满足一些条件。您可能希望生成自己的参数有几个原因。

  1. 您的软件附带的参数可能太短。虽然 1024 位 dh 尚未公开破解,但怀疑一些资金雄厚的攻击者可能已经这样做了。
  2. 破解 dh 的大部分工作是每组参数而不是每个会话。因此,使用与其他人相同的参数可以让攻击者重复使用他们的工作来破解来自不同服务器的许多会话。
  3. 可以创建后门参数,这些参数可以很容易地被生成它们的实体破解,但对其他人来说看起来很好。更偏执的人可能会担心他们的软件附带的参数是后门的。

因为没有使用 RC4 的 DHE 密码套件。因此,在您的配置中,只有当客户端不支持您明确标识的任何密码套件,而是最终使用“HIGH”列表中的传统“DHE”密码套件之一时,这才有意义。

如果客户支持,我想支持 PFS(前向保密)。

要获得前向保密,您需要使用 DHE 或 ECDHE 密码套件,因此如果前向保密是您的优先事项,您应该将它们放在任何其他密码套件之前。为了获得最佳兼容性和性能,您应该将 ECHDE 密码套件放在相应的 DHE 密码套件之前。

最后,在将密码套件列表硬编码到您的软件中之前,请仔细考虑。哪些选项被认为是最好的可以并且确实会随着时间而改变。