如何允许用户在 iOS 中使用 AFNetworking 信任和固定自签名 SSL 证书

Posted

技术标签:

【中文标题】如何允许用户在 iOS 中使用 AFNetworking 信任和固定自签名 SSL 证书【英文标题】:How do I allow a user to trust and pin a self-signed SSL Certificate using AFNetworking in iOS 【发布时间】:2014-01-21 21:27:33 【问题描述】:

我正在开发一个供企业使用的 ios 应用程序。我们的应用程序将与可能配置有部署我们服务器软件的公司生成的自签名证书的服务器通信。

我们的 iOS 应用程序使用允许 SSL 固定的 AFNetworking。但我得到的印象是,这只固定 SSL 证书,这些证书在创建时作为应用程序包的一部分包含在内。它不允许您使用 iOS 设备稍后知道的证书。

我正在寻找一种方法让客户推出(可能通过配置文件)自签名证书,以便我们的应用程序可以安全地与服务器通信。有办法吗?还是我需要跳过 AFNetworking 直接使用 Foundation 类。

我也欢迎任何 cmet 帮助澄清这个问题。

更新:对于可能像我一样困惑的其他人。虽然我理解 pinning 是一个重要的话题,但我把它与我的首要任务混淆了:从我们的原型应用程序中删除对无效证书的支持。我想要的是一种让用户明确信任自签名证书的方法。这很简单。只需将其作为配置文件添加到您的 iOS 设备即可。但我也被我们在开发中使用的自签名证书不太正确,因此 iOS 不会信任它们这一事实绊倒了我。请参阅http://blog.httpwatch.com/2013/12/12/five-tips-for-using-self-signed-ssl-certificates-with-ios/,了解如何生成“良好”的自签名证书。现在我已经拥有了受信任的自签名证书,我将跟进如何使用 pinning。

【问题讨论】:

您使用的是 AFNetworking 1 还是 2? 我使用的是版本 2。 【参考方案1】:

你说得对,AFSecurityPolicy 有一个属性pinnedCertificates,如果你使用policyWithPinningMode: 工厂方法,它默认使用 app bundle 中的任何证书。

要使用您自己的证书,请将此属性设置为包含每个用户证书的 NSData 表示形式的 NSArray:

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
NSData *certificateData = [NSData dataWithContentsOfFile...
securityPolicy.pinnedCertificates = @[ certificateData ];

【讨论】:

感谢大卫的回复。我们将对此进行测试。 没问题,告诉我你的进展情况 我们可能需要一两个星期才能做到这一点。我会将您的答案标记为正确。 (文档当然支持你。我刚刚在查看文档时错过了这一点。或者我正在查看文档的旧版本。) 我知道使用 AFNetworking 1 是不可能的,但是 v2 由于其出色的设计而非常灵活。你也有有趣的用例。 大卫,我只是在想这不应该是一个有趣的用例。我现在只是在调查(根据您的回答)如何访问 iOS 配置文件。我以为我只是通过电子邮件发送证书。点击它。系统会询问用户是否要作为配置文件导入。然后我想我可以要求操作系统给我证书(作为 NSData)并将它传递给 pinnedCertificates 属性。但是根据我所做的搜索,无法访问配置文件。到目前为止我看到的最好的建议是:devforums.apple.com/message/603203#603203

以上是关于如何允许用户在 iOS 中使用 AFNetworking 信任和固定自签名 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFNetwork 的 AFHTTPRequestOperationManager 设置 HTTP 请求正文?

iOS HTTPDNS集成,结合AFNetwork进行“ip直连”

AFNetwork 作用和用法详解

如何允许用户在 iOS 中使用 AFNetworking 信任和固定自签名 SSL 证书

iOS 9:如何检测用户何时对推送通知请求说“不允许”? [复制]

如何在 S3 中存储数据并允许用户使用 rails API / iOS 客户端以安全的方式访问?