如果部署了有效证书,iOS AFNetwork SSL固定模式是否会提供额外的安全奖励

时间:2014-07-05 07:16:04

标签: ios security ssl https pinning

根据我的理解,SSL Pinning是预先将服务器的公钥或认证与客户端中捆绑的副本进行比较。

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

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

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

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

非常感谢。

2 个答案:

答案 0 :(得分:6)

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

证书锁定最突出的用户可能是谷歌浏览器,它用于谷歌域名,这有助于检测DigiNotar和Comodo的妥协。

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

  

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

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

答案 1 :(得分:3)

很难明确地断言钉住是更好还是更差,因为它会将风险转移到另一方。

固定将从根本上保护您免受您信任的任何CA中的潜在违规行为。如果CA遭到入侵并且为您尝试联系的主机颁发证书,则固定将保护您免受此攻击,因为您将与您固定的特定参考进行比较,而不是通过CA.

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

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

我不知道AFNetworking的钉扎机制取代了PKI验证或补充它。

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

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

(很明显,我并不是说CA更好,只是固定会改变一系列问题。)