让 curl 在 iOS 上支持 SSL Pinning

前些天为 LeanCloud iOS SDK 实现 SSL pinning 时遇到一个问题。

LeanCloud iOS SDK 目前使用 curl 访问 REST API,因此要使用 curl 提供的接口来实现 SSL pinning。

从 curl 的 changelog 来看,从 7.39.0 开始就支持 SSL pinning 了。但测试后发现在 iOS 上并不支持。最初,我怀疑是不是有些选项没有设置。但按照官方给出的代码和步骤进一步测试,仍然没有成功。因此,我把问题原因转移到了 curl 身上。

查看 curl 的源码后,发现 darwinssl.c 文件根本没有实现 SSL pinning 的逻辑。也就是说,在 iOS、OS X 等基于 Darwin 的平台上,的确不支持 SSL pinning。不过奇怪的是,其他 SSL backends 却是支持的,比如 OpenSSL 和 GnuTLS。

于是,我把 SSL pinning 移植到了 Darwin 平台。移植过程比较简单,因为有其他 SSL backends 的实现作为参照。

目前支持了 public key 这一种方式,已经满足需求了。

实现代码在 leancloud-curl 这个仓库中。