我不太了解 SSL 连接建立中证书固定的必要性(以避免中间人攻击)。
SSL 证书固定需要在主机中嵌入原始服务器证书以与服务器提供的证书进行验证。嵌入在主机中的服务器证书与服务器提供的要由客户端验证的证书有什么区别?
我在这里想念什么?
我不太了解 SSL 连接建立中证书固定的必要性(以避免中间人攻击)。
SSL 证书固定需要在主机中嵌入原始服务器证书以与服务器提供的证书进行验证。嵌入在主机中的服务器证书与服务器提供的要由客户端验证的证书有什么区别?
我在这里想念什么?
嵌入在主机中的服务器证书与服务器提供的要由客户端验证的证书有什么区别?
应该没有,这正是证书固定的重点。
如果没有证书固定,应用程序通常会接受与请求的主机名匹配并由本地受信任的 CA(证书颁发机构)颁发的任何证书。鉴于本地信任存储中通常有 100 多个 CA,其中一个被成功攻击就足够了,就像2011 年DigiNotar 的情况一样。因此,将您接受的证书限制为特定的证书是有意义的,即固定.
除了通过将收到的证书与本地存储的证书进行比较来锁定证书之外,还有其他锁定方法:例如,可能只检查指纹(哈希)而不是完整的证书。如果证书可能过期,则仅检查公钥而不是整个证书可能会更有用,因为公钥通常在证书更新时保留。或者可以固定到一个特定的 CA,该 CA 认为该 CA 为该域颁发证书。
请注意,要了解固定,您可能需要了解服务器的身份验证是如何工作的。其中一部分是验证服务器证书(主机名,到期,信任链......)。但这还不够,因为证书本身是公开的,即每个人都可以得到它并可以在 TLS 握手中发送它。因此,身份验证的另一个主要部分是服务器证明它是证书的所有者。这是通过使用与证书匹配的私钥对一些数据进行签名来完成的。由于只有证书的所有者应该拥有私钥,这证明了所有权。因此,任何人都可以嵌入服务器证书以进行固定,但只有服务器本身才能证明证书的所有权。
应用程序被配置为信任少数证书或证书颁发机构 (CA),而不是默认行为:信任设备/机器上预先配置的所有 CA。不需要SSL 固定。
在许多情况下,只要任何根(或中间根)CA 被破坏(很少发生),服务器返回的证书就可能被篡改。威胁参与者可以使用这个被入侵的 CA 为您的网站生成证书,并向访问者展示他们的网站。这是不好的。SSL pinning 旨在在某些情况下防止这种情况发生,但有更好的方法(恕我直言)。
话虽如此,我不知道有任何网站使用 SSL pinning,因此 SSL pinning 似乎主要针对移动应用程序进行讨论。似乎 SSL pinning仅在您可以信任应用程序的来源(例如 App Store、Play Store)时才有效。为什么?因为如果您必须访问一个网站才能获得证书,那么到那时为时已晚(您可能已经使用了一个狡猾的证书并访问了假网站或被 MITM'd)。因此,Steffen 提到的好处似乎并不那么引人注目,尤其是当已经有更好的解决方案时:
我不确定任何 CA 妥协是否是威胁媒介,即使对于银行也是如此。相反,银行和其他有安全意识的组织将明智地选择他们的 CA,并配置CAA 记录。
例如,Monzo.com(我使用whatsmydns找到这个)有一个 CAA 记录,它将证书限制为仅 4 个 CA(digicert、amazon、comodoca、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 pinning 将如何变得无处不在,尤其是因为它增加了更多开销(关于 ssl 到期的维护,或者无论如何都信任一个 CA - SPoF,或者模拟 CAA 记录的功能,但有额外的代码/维护负担)。它还只支持您预装的应用程序,而不支持网站。