为什么需要SSL证书固定?

时间:2017-08-15 18:19:33

标签: ssl ssl-certificate certificate-pinning

我不太了解在高度安全的SSL连接建立中证书固定的必要性(以避免中间人攻击)。

SSL证书锁定需要在主机中嵌入原始服务器证书以验证服务器提供的证书。嵌入在主机中的服务器证书与服务器提供的服务器证书之间有什么区别?

我在这里失踪的是什么?

2 个答案:

答案 0 :(得分:6)

  

主机中嵌入的服务器证书与客户端要验证的服务器证书之间的区别是什么?

应该没有,这正是证书固定的重点。

如果没有证书固定,应用程序通常会接受与所请求的主机名匹配的任何证书,并由本地受信任的CA(证书颁发机构)颁发。鉴于本地信任存储中通常有超过100个CA,因此在2011年the case of DigiNotar中成功攻击其中一个就足够了。因此,将您接受的证书限制为特定的证书是有意义的,即钉扎。

除了通过将收到的证书与本地存储的证书进行比较而固定证书之外,还有其他固定方式:例如,可能只检查指纹(哈希)而不是完整证书。如果证书可能过期,则仅检查公钥而不是整个证书可能更有用,因为公钥通常保留在证书续订上。或者可以将特定的CA固定到一个认为可信的CA来为该域颁发证书。

请注意,要了解固定,您可能需要了解服务器的身份验证的工作原理。其中一部分是验证服务器证书(主机名,过期,信任链......)。但这还不够,因为证书本身是公开的,即每个人都可以获得它并且可以在TLS握手内发送它。因此,身份验证的另一个主要部分是服务器证明它是证书的所有者。这是通过使用与证书匹配的私钥对某些数据进行签名来完成的。由于只有证书的所有者才能拥有私钥,因此证明了所有权。因此,任何人都可以嵌入服务器证书进行固定,但只有服务器本身可以证明证书的所有权。

答案 1 :(得分:1)

什么是 SSL 固定

应用程序被配置为信任选定的几个证书或证书颁发机构 (CA),而不是默认行为:信任在设备/机器上预先配置的所有 CA。 SSL 固定不是要求

为什么使用 SSL Pinning(为什么不使用)

在许多情况下,只要任何根(或中间根)CA 遭到破坏,服务器返回的证书就可能被篡改(这种情况很少发生)。威胁行为者可以使用这个被入侵的 CA 为您的网站生成证书,并向访问者展示他们的网站。这是不好的。 SSL 固定旨在在某些情况下防止这种情况发生,但有更好的方法(恕我直言)。

话虽如此,我不知道任何使用 SSL 固定的网站,因此 SSL 固定似乎主要针对移动应用进行讨论。似乎 SSL 固定在您可以信任应用程序的来源(例如 App Store、Play Store)时才有效,为什么?因为如果你必须访问一个网站来获得证书,那么为时已晚(你可能已经使用了一个狡猾的证书并访问了假网站或被中间人攻击了)。因此,Steffen 提到的好处似乎并不那么引人注目,尤其是在已经有更好的解决方案的情况下:

更好的解决方案

我不确定 any-CA-compromise 是否是威胁媒介,即使对于银行也是如此。相反,银行和其他具有安全意识的组织会明智地选择他们的 CA,并配置 CAA record

  • 通过使用 CAA DNS 记录,他们可以限制客户端(例如浏览器、移动应用)在访问其特定网站时仅信任某些证书。
  • 他们选择 CA 并仅从该 CA 创建证书
  • 如果 CA 遭到破坏,他们将制定备份计划。不想在这里讨论这个,但恕我直言,CAA 记录的备份计划比 SSL 固定要好得多。

例如,Monzo.com(我使用 whatsmydns 找到了这个)有一个 CAA 记录,该记录将证书限制为仅 4 个 CA(digicert、amazon、commodoca、buypass):

0 iodef "mailto:security@monzo.com"
0 issue "amazon.com"
0 issue "buypass.com"
0 issue "comodoca.com"
0 issue "digicert.com"
0 issue "letsencrypt.org"
0 issuewild "amazon.com"
0 issuewild "comodoca.com"
0 issuewild "digicert.com"
0 issuewild "letsencrypt.org"

这些是人们信任的流行 CA,我们希望他们不会让我们失望。如果他们这样做,整个互联网将是免费的。防止这种情况的唯一方法是成为您自己的 CA/使用自签名证书。

总结

我不知道 SSL 固定将如何变得无处不在,尤其是因为它增加了更多开销(关于 ssl 到期的维护,或无论如何信任一个 CA - SPoF,或模拟 CAA 记录的作用但有额外的代码/维护负担) .它还仅支持您预装的应用程序,不支持网站。