我想将根CA(verisign - http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem)的公钥固定到我的iOS应用中。 是更好地固定公钥或subjectPublicKeyInfo? 有人可以解释一下哪种方法更好,为什么?
答案 0 :(得分:5)
我认为最好固定主题的公钥而不是root的CA公钥。 以下是我对固定CA根源的不同权衡的理解:
好的 只要您保留相同的CA,您就可以一遍又一遍地更新您的证书,它将一直有效。
糟糕 我相信你会更容易受到MITM攻击的影响,因为你将使用该CA签署的任何证书,而不是那些真正符合你主题的证书。 p>
如何固定主题的公钥呢? 基本上,您应该比固定CA的公钥更安全一点,并且您的应用程序应该在证书过期后继续工作并且您续订它,只要您保持相同的公钥。
我刚刚发布了一个关于如何固定公钥的问题和解决方案,我希望它可以帮助您: How to pin the Public key of a certificate on iOS
答案 1 :(得分:2)
我想固定根CA的公钥......
只是自行车脱落,但它可能更安全地固定服务器或服务的证书或公钥,而不是根或中间证书。如果您使用的是DigiCert或Verisign等公共CA(而不是私有的公司CA),则尤其如此。
对于公共CA,CA可能会错误地发出第二个证书,而客户端将无法区分“真实”和“真实”。证书(发给你的证书)和#34;假的"证书(一个发布不正确)。这已经在现实生活中发生了很多次,所以你应该期待它再次发生。
最好是固定公钥还是subjectPublicKeyInfo?有人可以解释一下哪种方法更好,为什么?
最好固定公钥(至少在固定服务器证书的情况下)。
某些组织(如Google)每30天左右轮换一次服务器证书。但是,他们重新认证相同的公钥。例如,请参阅Android 4.2 and Pinning。这意味着你将观察到关键连续性"但不"证书连续性"。
重新认证相同的公钥是CertPatrol在某些情况下在用户体验中失败的原因。在谷歌服务等情况下,我们确实需要公钥密码巡逻。
答案 2 :(得分:0)
最好固定SPKI(主题公钥信息),因为它包含实际公钥和密钥算法(RSA,ECDSA等)。这篇文章在Google的TLS大师的文章中有更详细的描述 https://www.imperialviolet.org/2011/05/04/pinning.html:
SPKI包括公钥的类型和一些参数以及公钥本身。这一点非常重要,因为只需对公钥进行哈希处理就可以解决误解攻击。考虑一个Diffie-Hellman公钥:如果只有一个哈希公钥,而不是整个SPKI,那么攻击者可以使用相同的公钥,但让客户端在不同的组中解释它。同样,可以强制将RSA密钥解释为DSA密钥等。
在iOS应用程序中固定SPKI的一个挑战是iOS上的安全框架不提供用于解析证书和提取SPKI位(https://nabla-c0d3.github.io/blog/2015/08/11/security-framework-wish-list/)的API。
好消息是开源库可以做到这一点:https://github.com/datatheorem/TrustKit。