使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true
Posted
技术标签:
【中文标题】使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true【英文标题】:SSL Pinning with AFNetworking - validatesCertificateChain = true 【发布时间】:2015-07-07 02:46:48 【问题描述】:我正在尝试使用 AFNetworking 2.5.4(带有 Comodo 证书)制作固定 SSL。 我从服务器获取我的证书 (CER)。
openssl s_client -connect example.com:443 -showcerts
获取第一个 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 之间的输出并将其保存到 example.pem
从 PEM 转换为 CER (DER):
openssl x509 -outform der -in example.pem -out example.cer
然后,我将 example.cer 添加到我的 Xcode 项目中,并将其添加到“复制捆绑资源”构建阶段。我的安全策略是:
let securityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.PublicKey)
let certificatePath = NSBundle.mainBundle().pathForResource("example", ofType: "cer")!
let certificateData = NSData(contentsOfFile: certificatePath)!
securityPolicy.pinnedCertificates = [certificateData];
securityPolicy.validatesDomainName = true
securityPolicy.allowInvalidCertificates = false
securityPolicy.validatesCertificateChain = false
manager.securityPolicy = securityPolicy
有了这个 SSL Pininning 工作,但我不仅要验证我更改的叶证书
securityPolicy.validatesCertificateChain = true
但是使用该配置会引发以下错误:
Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)
我已阅读 if securityPolicy.validatesCertificateChain = true 我必须输入整个 SSL 证书链但我不知道如何生成它。
我尝试使用以下代码但不起作用(我得到相同的错误):
openssl s_client -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > example.cer
如何获取整个 SSL 证书链以添加到 Xcode?p>
【问题讨论】:
【参考方案1】:您还必须将所有中间 CA 证书添加到 securityPolicy.pinnedCertificates 以验证整个链。
【讨论】:
我尝试添加中间 CA 证书,但没有成功。如何正确添加中间 CA 证书? 固定的目的是为了防止 MIMT,并且完全忽略了与信任 Comodo 等 CA 相关的风险,以免受到损害。所以也许在这种情况下,由于您正在固定公钥,您不应该验证证书链。您应该设置 securityPolicy.validatesCertificateChain = false。另一件事是确保您的证书和您连接的服务器上的域名相同。您可以通过设置 securityPolicy.validatesDomainName = false 进行测试。 如果要避免 MIMT 验证证书链,为什么 validatesCertificateChain 应该为假?并且 validatesDomainName 应该为 true 以验证服务器和客户端是否相同? 因为您将服务器证书固定到我们的应用程序中,您只需验证服务器发送给您的服务器证书以确保相同。无需检查签名。 我的意思是不需要检查信任链。以上是关于使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetworking 进行证书/SSL 固定 - 如果孩子受信任,如何信任所有父母证书?
如何允许用户在 iOS 中使用 AFNetworking 信任和固定自签名 SSL 证书