5

据我了解,SSL Pinning 是将服务器的公钥或证书与事先捆绑在客户端中的副本进行比较。

我在 Stackoverflow 中看到许多开发人员使用 AFNetwork 库的 SSL Pinning,但他们中的大多数人将它与自签名证书一起使用。

我从 CA 购买了有效证书并通过了测试以验证它工作正常。我的意思是,我设置了以下内容并且它有效

    ...
    _sharedHttpsInstance.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    _sharedHttpsInstance.securityPolicy.allowInvalidCertificates = NO;
    ...

我想知道的是,如果将 Pinning 模式设置为 AFSSLPinningModePulicKey,除了有效证书提供的内容之外,我的应用程序与服务器的通信会更加安全吗?

多谢。

4

2 回答 2

6

我不知道 iOS 中 SSL pinning 的确切实现,但原则上 pinning 提供的安全性肯定比针对一组内置证书机构的默认验证更安全。默认情况下,系统信任来自世界各地的 100 多个不同的 CA,并且每个 CA 都有能力颁发它想要的任何证书,即使另一个 CA 已经颁发了相同或类似的证书。因此,如果这 100 多个 CA 中的任何一个受到威胁,他们可以为您的域颁发证书,除非您使用证书固定,否则它将通过您的应用程序中的检查。这种妥协发生在 2011 年,DigiNotar(因此不再存在)和 Comodo(太大而不能倒)。

证书锁定最突出的用户可能是 Google Chrome,它用于 google 域,这有助于检测 DigiNotar 和 Comodo 的危害。

证书固定的一个缺点可能是,应用程序将停止在出于安全原因进行 SSL 拦截的网络内部工作。谷歌浏览器似乎通过接受证书来处理这种情况,如果证书是由用户明确添加的(即没有内置的)CA 签名的,而不是固定检查。

另一个可能有趣的问题是,即使与自签名认证一起使用,SSL 固定对于“大多数”应用程序是否是安全的“ENOUTH”?

检查固定证书或公钥(例如,带有或不带有自签名的证书固定)比仅检查证书是否由系统信任的 100 多个 CA 中的任何一个签名更安全。只要开发人员对双方(例如应用程序和服务器)都有完全的控制权,它也可以很好地扩展。额外使用常规基础设施的唯一优势是使用证书撤销机制。但是因为开发人员可以控制应用程序,所以他可以替换应用程序,以防证书被泄露。所以是的,在大多数情况下,使用自签名证书进行 SSL 固定就足够安全了,而且它比使用不固定的标准证书验证更安全。

于 2014-07-05T08:15:56.513 回答
3

很难断然说钉住是好是坏,因为它将风险转移到了另一方。

固定基本上可以更好地保护您免受您信任的任何 CA 中的潜在违规行为。如果 CA 被破坏并被要求为您尝试联系的主机颁发证书,固定将保护您免受这种情况的影响,因为您将与您固定的特定参考进行比较,而不是通过 CA。

缺点是它会阻止您使用 CA 现有的机制来处理受损主机:证书吊销。如果主机的私钥被泄露,通过 PKI 验证机制应该允许您检查撤销,并被警告发生此类问题。相反,您将无法通过固定知道这一点,因为您根本没有通过 CA 来检查证书。

当然,您可以将这两种方法结合起来,但这可能会导致额外的问题(您需要一种策略来处理两种评估中相互冲突的结果,否则受损的 CA 撤销有效证书可能会导致 DoS)。

我不知道 AFNetworking 的固定机制是否取代了 PKI 验证或补充了它。

通常,在使用固定或 PKI 验证之间进行选择取决于您是否认为特定主机的私钥比您信任的 CA 更容易受到损害。

固定的另一个缺点是,每次服务器证书(或至少是密钥对,取决于您固定的内容)被合法更改时,您都需要更新应用程序(或让用户“重新固定”)。偶尔重新键入一次可能不是一个坏主意。

(需要明确的是,我并不是说 CA 更好,只是固定改变了一系列问题。)

于 2014-07-06T14:40:00.900 回答