在开发和调试网络应用时,能够捕获客户端和服务器之间的传输数据是非常有用的。对于使用SSL的Web服务开发来说,引入MITM代理会生成一个关于代理返回的不受信任证书的安全警告。如果客户端是Web浏览器,只需要在浏览器警告提示上接受异常即可。对于使用NSURLConnection或相关类的iOS原生应用来说,这有点棘手,因为它会生成“不受信任的服务器证书”错误。虽然可以通过使用纯HTTP进行开发或编程方式禁用证书验证来绕过这个问题,但这些技术需要在开发结束时进行代码更改。忘记这样做将明显导致应用程序的安全问题。此外,在最终代码更改之前,也无法对SSL基础设施进行功能或性能测试。更好的策略是在客户端密钥链中安装证书(最好是代理使用的根证书)作为受信任的证书。本文将提供从安装MITM代理到在客户端设备和模拟器上设置自定义根CA的逐步指南。
iOS模拟器上安装证书并不简单。幸运的是,有关此主题的一些很好的研究已经完成。本文讨论的很多信息都来自这些参考资料。其中一些信息可能已经过时,但对于那些想要寻找更多细节和历史的人来说,它们是获取信息的绝佳来源。即使不使用MITM代理,也可能遇到需要使用自定义证书开发iOS应用程序的其他情况。例如,为已经使用内部自定义根CA的公司开发应用程序,或者开发环境没有配置任何设备或模拟器信任的知名根CA签名的证书(可能是由于成本或部门间开销)。本文提供的信息对所有这些情况也将有所帮助。
有许多免费的MITM代理可以用来嗅探SSL流量。这里,使用OWASP ZAP来说明这一点。选择OWASP ZAP有几个原因:
从下载OWASP ZAP。解压缩并将应用程序移动到/Applications文件夹(可选)。启动OWASP ZAP。系统会提示生成根CA证书。生成并保存它(一个.cer文件)。将证书附加到电子邮件并发送给自己。在iOS设备上打开带有证书附件的电子邮件。点击附加的证书并将其安装到设备上。默认情况下,代理侦听localhost:8080。转到Tools -> Options和Local proxy标签,将Address更改为0.0.0.0,允许来自所有接口的流量,并在必要时更新端口号。将设备网络HTTP代理指向运行OWASP ZAP的计算机。指定IP和端口。使用Safari或使用任何使用HTTP/HTTPS的应用程序浏览。流量现在应该被OWASP ZAP捕获。
设置主机计算机的Internet连接以使用代理。模拟器使用主机OSX计算机的Internet连接设置。所以需要更改网络设置。确保https流量使用上面设置的代理。
这是棘手的部分。每个版本的iPhone模拟器都有自己的位置来存储自定义受信任证书信息。要添加自定义根CA证书,需要更新相应的SQLite文件。将它们添加到OSX系统证书列表只会帮助消除代理流量时的SSL错误。然而,它将允许代理OSX中的Safari Web应用程序流量。提到的SQLite数据库(称为TrustStore.sqlite3)存储在~/Library/Application Support/iPhone Simulator/
chflags nohidden ~/Library
像其他SQLite数据库一样,可以使用最喜欢的编辑器查看和编辑它们。使用SQLite Manager Firefox插件进行演示。然而,iPhone模拟器没有UI让添加证书。即使通过Safari访问自定义CA证书(通过将证书放在Web服务器上),只能看到设置应用程序弹出,其他什么也不会发生。幸运的是,iOS设备和模拟器都使用了相同的机制,所以可以利用物理设备中已经接受的自定义证书的SQLite数据库,如本文前面所述。要获取设备的SQLite数据库,请使用一个免费的桌面应用程序。不需要越狱。使用iTunes为之前使用的设备创建备份。确保关闭加密。