使用 AFNetworking 进行证书/SSL 固定 - 如果孩子受信任,如何信任所有父母证书?
Posted
技术标签:
【中文标题】使用 AFNetworking 进行证书/SSL 固定 - 如果孩子受信任,如何信任所有父母证书?【英文标题】:Certificate/SSL pinning with AFNetworking - How to trust all parents certificates if the child is trusted? 【发布时间】:2014-04-09 23:35:23 【问题描述】:我只想信任特定证书 + 所有根证书。例如:
GeoTrust Global CA <= Automatically trusted
Google Internet Authority G2 <= Automatically trusted
*.google.com <= Trusted because in a .cer in the app bundle
但是现在 AFNetworking 2.2.1 发生的事情是这样的:
GeoTrust Global CA <= Not trusted because not in the bundle
Google Internet Authority G2 <= Not trusted because not in the bundle
*.google.com <= Trusted because in a .cer in the app bundle
如何也接受根证书?
【问题讨论】:
【参考方案1】:您的证书是由 Google Internet Authority G2 CA 颁发的,根 CA 是 GeoTrust Global CA,因此该证书应受 ios 信任。确实如此。
您可以在此处查看“List of available trusted root certificates”。
https://developer.apple.com/library/ios/documentation/Security/Reference/certifkeytrustservices/#//apple_ref/c/func/SecTrustEvaluate
SecTrustEvaluate 函数根据信任管理对象中包含的一个或多个策略验证证书的签名以及证书链中证书的签名,直至锚证书。
如果信任管理对象中缺少验证叶证书所需的某些证书,则 SecTrustEvaluate 会在以下位置搜索证书:
当前在调用者的钥匙串搜索列表中的任何钥匙串中(请参阅 SecTrustSetKeychains)。 以前通过调用 SecTrustSetAnchorCertificates 提供的任何证书。 在系统提供的为此目的提供的一组钥匙串中。 如果用于构建链的证书中存在某些扩展,则通过网络。
所以,如果 SecTrustEvaluate 返回 errSecSuccess 并且结果是 kSecTrustResultUnspecified/kSecTrustResultProceed,则它已经信任证书链。
在您的情况下,validatesCertificateChain 为 YES,因此它将证书链中的每个证书数据与捆绑包中的证书文件进行比较。通常用于验证自签名证书。你应该禁用它。
【讨论】:
【参考方案2】:AFNetworking 2.1.0 添加了certificate chain validation,默认为YES(验证链)。您可以禁用它:
// policy used by AFHTTPRequestOperation / AFHTTPRequestOperationManager
AFSecurityPolicy *securityPolicy = somePolicy;
securityPolicy.validatesCertificateChain = NO;
【讨论】:
以上是关于使用 AFNetworking 进行证书/SSL 固定 - 如果孩子受信任,如何信任所有父母证书?的主要内容,如果未能解决你的问题,请参考以下文章
iOS SSL Pinning 没有使用 AFNetworking 的证书?
使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true
使用 AFNetworking 2.3.1 的自签名 SSL 证书