65.9K
CodeProject 正在变化。 阅读更多。
Home

使用中间人代理在iOS设备和模拟器上调试SSL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (6投票s)

2012年10月30日

CPOL

7分钟阅读

viewsIcon

30772

本文介绍如何为从 iOS 客户端到服务器的 SSL Web 服务设置调试环境,使用中间人代理。

引言

在当今的移动应用程序架构中,使用移动设备上的 Web 服务非常普遍。对于敏感信息的传输,通常必须使用 SSL 对数据进行加密。在这种情况下,使用中间人(MITM)代理来嗅探流量是一项非常有用的技术。然而,使用 MITM 代理开发 iOS 原生应用程序会带来独特的挑战。本文将提供一个分步说明,介绍如何使用免费软件设置调试环境。

背景  

在开发和故障排除网络应用程序时,能够嗅探客户端和服务器之间传输的数据非常有价值。对于使用 SSL 的 Web 服务开发,引入 MITM 代理会因代理返回的证书不受信任而产生安全警告。如果客户端是 Web 浏览器,我们只需要接受浏览器警告提示中的例外。对于使用 NSURLConnection 或相关类进行开发的 iOS 原生应用程序,情况会有些棘手,因为它会产生“不受信任的服务器证书”错误。虽然我们可以通过使用纯 HTTP 进行开发或以编程方式禁用证书验证来绕过这个问题,但这些技术都需要在开发结束时进行代码更改。如果忘记这样做,显然会导致应用程序出现安全问题。而且,在最终更改代码之前,无法对 SSL 基础架构进行任何功能或性能测试。更好的策略是将证书(最好是代理使用的根证书)安装到客户端密钥链中,作为受信任的证书。本文将提供一个从安装 MITM 代理到在客户端设备和模拟器上设置自定义根 CA 的分步指南。

事实证明,在 iOS 模拟器上安装证书并不容易。幸运的是,在这方面有一些很好的研究[1,2]。本文中讨论的许多信息都取自这些参考文献。其中一些信息已经过时,但对于想要了解更多细节和历史的人来说,它们是极好的信息来源。

即使您可能不使用 MITM 代理,也可能会遇到其他需要使用自定义证书进行开发的 iOS 应用程序的情况。例如:
  • 为已经使用内部自定义根 CA 的企业开发应用程序
  • 开发环境未配置由设备或模拟器信任的任何知名根 CA 签名的证书(可能是由于成本或部门间开销)

在所有这些情况下,本文提供的信息也将有所帮助。

选择代理

有许多免费的 MITM 代理可用于嗅探 SSL 流量。在此,我们将以 OWASP ZAP 为例进行说明。我们选择 OWASP ZAP 有几个原因: 

  1. 它支持由自定义根 CA 证书签名的动态站点证书生成,此功能允许仅在设备上安装一个自定义根 CA 证书,从而使设备上的任何应用程序都能自动接受来自所有 SSL 主机的流量。这便是我们示例中将使用的策略。
  2. 它支持自定义密钥生成,这降低了开发人员的风险,因为他们很可能会将该根 CA 证书安装为自己设备上的受信任根 CA。有些代理只附带一个根证书,而且不容易更改。虽然可能性很小,但任何人下载相同的私钥都可以解密 SSL 流量,从而使开发人员自己的设备面临风险。有了自定义生成的密钥,这个问题就不再是问题了。
  3. 与其它代理相比,它还支持一系列有竞争力的功能。

在 OSX 上安装 OWASP ZAP 并将其连接到物理 iOS 设备

  1. 从 [3] 下载 OWASP ZAP。
  2. 解压缩应用程序并将其移动到 /Applications 文件夹(可选)。
  3. 启动 OWASP ZAP。系统会提示您生成根 CA 证书。生成并保存它(一个 .cer 文件)。
  4. 将证书附加到电子邮件中并发送给自己。
  5. 在 iOS 设备上用电子邮件打开带有证书附件的邮件。点击附件中的证书并将其安装到设备上。
  6. 默认情况下,代理监听的端口是 localhost:8080。转到 Tools -> Options 和 Local proxy 选项卡,将 Address 改为 0.0.0.0,允许来自所有接口的流量,并在必要时更新端口号。

     
  7. 将设备网络 HTTP 代理指向运行 OWASP ZAP 的计算机。指定 IP 和端口。
  8. 使用 Safari 或使用任何使用 HTTP/HTTPS 的应用程序进行浏览。流量现在应该被 OWASP ZAP 捕获。

将代理与 iOS 模拟器一起使用

设置主机计算机的互联网连接以使用代理

模拟器使用主机 OSX 计算机的互联网连接设置。所以我们需要更改网络设置。确保 https 流量正在使用上述代理设置。

将自定义 CA 安装到 iOS 模拟器的密钥链

这是棘手的部分。每个版本的 iPhone 模拟器都有自己存储自定义受信任证书信息的特定位置。要添加自定义根 CA 证书,您需要更新相应的 SQLite 文件。仅将其添加到 OSX 系统证书列表将无法消除代理模拟器流量时的 SSL 错误。但是,它将允许您通过 OSX 中的 Safari 代理 Web 应用程序流量。

提到的 SQLite 数据库(名为 TrustStore.sqlite3)存储在 ~/Library/Application Support/iPhone Simulator/<ios version>/Library/Keychains/ 文件夹中。~/Library 文件夹默认在 Finder 中是隐藏的。您可以使用“chflags”命令取消隐藏它,以方便使用。

chflags nohidden ~/Library

与其它 SQLite 数据库一样,您可以使用您喜欢的编辑器查看和编辑它们。我们以 SQLite Manager Firefox 插件为例进行演示。

然而,iPhone 模拟器没有 UI 供您添加证书。即使您通过 Safari 访问自定义 CA 证书(通过将证书放在 Web 服务器上),您只能看到“设置”应用程序弹出,而不会发生其他任何事情。

幸运的是,iOS 设备和模拟器使用相同的机制,因此我们可以利用物理设备上已经接受了本文前面所述的自定义证书的 SQLite 数据库。要从设备获取 SQLite 数据库,请使用一个名为 iPhone Backup Extractor 的免费桌面应用程序 [4]。无需越狱。使用 iTunes 为您之前使用的设备创建备份。确保禁用加密。

使用 iPhone Backup Extractor 提取 SQLite 数据库。该程序知道如何在您的计算机上找到您的 iTunes 备份。启动程序并选择您的设备的备份。从备份列表中选择“iOS Files”并将其保存到驱动器。在创建的“iOS Files”文件夹中可以找到有问题的 SQLite 数据库(TrustStore.sqlite3)。用 SQLite 编辑器打开它。我们将看到“tsettings”表中的已接受证书条目。将此条目复制到上面提到的模拟器 TrustStore.sqlite3 的相应表中。如果您使用的是 Firefox 插件进行编辑,并且由于最后 4 个值是 Blob 数据(至少在 iOS 5 和 6 中都是如此),您需要将单独的字段导出为文件,然后重新导入到模拟器的其他 TrustStore.sqlite3 中。双击 Blob 字段将调出导入/导出菜单。

如果您在设备上只有一个或几个条目,并且不介意将它们放入模拟器,也可以直接复制。我们已经对 iOS 5 和 6 都进行了尝试,它们似乎都有效。此外,文件格式似乎在两个版本之间也是兼容的,因此您可以例如从 iOS 5 设备中提取它,然后将其放入 iOS 6 模拟器中。

进行这些更改后重新启动 iPhone 模拟器,您现在应该能够无错误地通过代理查看 SSL 流量。

© . All rights reserved.