在 AFNetworking 中支持 SNI

Posted

技术标签:

【中文标题】在 AFNetworking 中支持 SNI【英文标题】:Supporting SNI in AFNetworking 【发布时间】:2015-05-13 10:47:46 【问题描述】:

我有一个根证书,用于在服务器上使用不同的子域名进行签名,这基本上是后端 SNI 的实现。现在如何使用该证书和子域名来验证请求。

【问题讨论】:

【参考方案1】:

SNI 支持开箱即用。根据我的经验,它可以工作(单个 IP 上的两个二级域)

如果它不适合您,我看到 3 个原因:

    您的后端配置不正确。您可以使用 Safari 检查服务器是否返回了预期的证书。 您的证书是自签名的。在这种情况下,您应该检查 AFSecurityPolicy 以获取固定证书,SNI 没有什么特别之处。 您的证书对子域无效。这也可以通过 AFSecurityPolicy 进行检查。

【讨论】:

我已确认我的后端配置正确,因为具有主机名的相同证书正在用于 android Webservice 调用。证书对域名有效,对于验证子域,我们定义了主机名。还正确固定了证书。你知道如何在 ios 中实现它。 如果您使用证书固定,我将从 AFSecurityPolicy.evaluateServerTrust 中的断点开始,您可以在其中检查连接建立的许多方面:如果证书检查已经开始;客户收到的证书;该方法的哪一步返回NO。顺便问一下,您目前遇到的错误是什么? 同样evaluateServerTrust返回NO,这行代码返回NO,if (!AFServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) return NO; 如果您知道为什么它返回 NO,请告诉我。 @WildFire 所以你的情况是#3 - 比如域是example1.com,证书对*.example2.com 有效?在这种情况下,很明显您应该将 allowInvalidCertificates 设置为 YES,以忽略域的验证。然后您的应用程序将依赖固定证书 - 只需将其以 DER 格式添加到扩展名为“.cer”的项目中,它将在 -defaultPinnedCertificates 中自动使用。可以通过这个命令获取合适的文件:openssl s_client -servername api.example.org -connect api.example.org:443 </dev/null 2>/dev/null | openssl x509 -outform DER > ~/api.example.org.cer 我已经按照您的描述做了所有事情,但仍然无法正常工作,基本上我有域 example.com 的根证书,API 托管在子域 domainname.example.com 上。基本上,对于相同的基本名称,我们有不同的子域。我们希望通过对 SNI 的支持为所有子域使用相同的根证书。

以上是关于在 AFNetworking 中支持 SNI的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.2.1 是不是支持 iOS 6.0? [复制]

具有 setReachabilityStatusChangeBlock 支持的 AFNetworking EnqueueBatchOfHTTPRequestOperations

RestKit 附带的 AFNetworking 1.3 不支持 IPv6

AFNetworking 3.0迁移指南

iOS网络开发之AFNetworking

AFNetworking 3.0迁移指南