随着互联网的发展,网站全面 https 化已经越来越被重视,做为 App 开发人员,从一开始就让 API 都走 SSL 也是十分必要的。但是光这样就足够了吗?

SSL 可以保护线上 API 数据不被篡改,但是防不了别有用心的发现你们 API,然后写脚本做一些事情。
 
Charles 的 SSL 代理
具体如何查看 SSL 的请求呢?可以使用 Charles 的 SSL 代理功能。
准备工作
下载安装最新版的 Charles(https://www.charlesproxy.com/),点开 Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device (如下图)
 

然后会弹出一个提示框:

 
打开你的 iPhone 测试机,设置网络代理到上述地址(你电脑的 IP):
 

然后在 Safari 中(只能是 Safari)访问 http://charlesproxy.com/getssl,系统会打开描述文件安装界面,点击右上角的安装(需要输入密码)。
 
 

安装成功后,在
设置 ->
通用 ->
描述文件与设备管理 下会多出一行:

 
开启代理
iPhone 安装好描述文件后,加到 Charles。点击 Proxy 菜单下的 SSL Proxying Settings:

 
在弹出的窗口中添加你感兴趣的 HOST,点 OK 保存,然后就可以在 Charles 中看到 HTTPS 的请求数据了。
 

本文以常见的微博为例,可以看到微博启动后发了如下请求,并且可以看到明文数据:

 
SSL Pinning
上述方法的原理其实不复杂,Charles 在 iPhone 测试机上安装了它自己的一个 CA,于是手机会信任由它签发的证书。Charles 充当了一个中间人,详见https://www.charlesproxy.com/documentation/proxying/ssl-proxying/。如何绕开这种情况呢?当然只能让手机只信任特定证书加密的包,于是就有了 SSL Pinning。
实现方式
首先问下后台的运维人员要到后台服务的 SSL PEM 格式的公钥,如 cert.pem,一般是一个纯文本文件,如:
-----BEGIN CERTIFICATE-----
MIIG4jCCBcqgAwIBAgIQDsAf+l9f2W2Jkl9C21bgSjANBgkqhkiG9w0BAQsFADBE
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMU
....
-----END CERTIFICATE-----

然后在命令行中使用 OpenSSL 工具链转换格式为 DER ( iOS 只能支持这个格式,注意!):

openssl x509 -outform der -in cert.pem -out cert.der

将文件添加到 Xcode 工程中去。如果使用 AFNetworking,那么实现将比较简单,下面以 AFNetworking 为例:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:@"https://api.foo.com"];

NSString *cert = [[NSBundle mainBundle] pathForResource:@"cert" ofType:@"der"];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:cert];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate
withPinnedCertificates:[NSSet setWithObjects:data, nil]];
manager.securityPolicy = policy;
...

从代码中可以看到,可以一次指定多个证书。

这样一来,App 只接受由指定证书加密的数据,其他数据会拒绝,如下图:

同时 App 端的表现是请求已取消。

网易云SSL证书服务提供云上证书一站式生命周期管理,与全球顶级的数字证书授权机构(CA,Certificate Authority)和代理商合作,为你的网站与移动应用实现 HTTPS 加密部署。

本文来自网易云社区,经作者谭歆授权发布。

原文地址:iOS SSL Pinning 保护你的 API

更多网易研发、产品、运营经验分享请访问网易云社区

iOS SSL Pinning 保护你的 API的更多相关文章

  1. 如何使用SSL pinning来使你的iOS APP更加安全

    SSL pinning在构建一个高度安全的移动APP上扮演了一个十分重要的角色.然而如今好多用户在使用无线移动设备去访问无数不安全的无线网络. 这篇文章主要覆盖了SSL pinning 技术,来帮助我 ...

  2. SSL Pining Mode 设置iOS SSL 连接安全

    一:SSL Ping Mode 使用SSL来进行网络通信成为了很多mobile app的默认选择.最近一些文章发现:一些app并没有采用“额外的措施”来保证窃听不可以发生:这个“额外的步骤“就是SSL ...

  3. SSLPinning简介,使用Xposed+JustTrustMe来突破SSL Pinning

    0x00 前面 如果你是一干Web安全的,当你在测试目前大多数的手机APP应用程序时,你一定遇到过burpsuite无法抓到数据包的情况,开始你以为只是https的问题,但是当你使用了burpsuit ...

  4. 在 Azure 中的 Windows 虚拟机上使用 SSL 证书保护 IIS Web 服务器

    若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Windows ...

  5. 在 Azure 中的 Linux 虚拟机上使用 SSL 证书保护 Web 服务器

    若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Linux 虚 ...

  6. 使用PostMan Canary测试受Identity Server 4保护的Web Api

    在<Asp.Net Core: Swagger 与 Identity Server 4>一文中介绍了如何生成受保护的Web Api的Swagger文档,本文介绍使用PostMan Cana ...

  7. 关于iOS和OS X废弃的API你需要知道的一切

    如你所知,已废弃(Deprecated)的API指的是那些已经过时的并且在将来某个时间最终会被移除掉的方法或类.通常,苹果在引入一个更优秀的API后就会把原来的API给废弃掉.因为,新引入的API通常 ...

  8. [译]关于iOS和OS X废弃的API你需要知道的一切

    原文: Everything You Need to Know about iOS and OS X Deprecated APIs 如你所知,已废弃(Deprecated)的API指的是那些已经过时 ...

  9. Arcgis API For IOS扩展AGSDynamicLayer新旧版API对比

    AGSDynamicLayer(ForSubclassEyesOnly) Category Reference Description This category organizes the meth ...

随机推荐

  1. iOS - CocoaPods 和 Carthage 的比较

    CocoaPods 好处? 开发 iOS 项目不可避免地要使用第三方开源库,CocoaPods 的出现使得我们可以节省设置和更新第三方开源库的时间 在引入第三方库时它可以自动为我们完成各种各样的配置, ...

  2. boost tss.hpp源码分析

    tss.hpp定义了thread_specific_ptr,使用thread local storage 技术 1.在thread目录下的win32和pthread目录下thread_data.hpp ...

  3. Centos6 Ngnix和fastcgi搭建

    一.下载Nginx 依赖pcre,zlib,openssl 下载解压包,解压后进入 ./configue make make install 默认安装到/usr/local/ngnix 可执行文件在/ ...

  4. ASP.NET Web API编程——构建api帮助文档

    1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架. 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框架自动集成到其中,使得Web Api项目 ...

  5. 理解JavaScript闭包(closure)

    闭包听了很多次了,可是到底有那些具体的用法还是不清楚,看了<JavaScript高级程序设计>,有点明白了. 1.闭包的定义: 闭包其实就是一个函数,而这个函数有点特别,它能够访问另一个函 ...

  6. 华为交换机SSH配置

    设备:S5700 一.在本地设备服务端生成秘钥对 [Huawei]rsa local-key-pair create 二.配置VTY [Huawei]user-interface vty 0 4进入虚 ...

  7. 支持向量机通俗导论(理解SVM的三层境界)[转]

    作者:July .致谢:pluskid.白石.JerryLead.说明:本文最初写于2012年6月,而后不断反反复复修改&优化,修改次数达上百次,最后修改于2016年11月.声明:本文于201 ...

  8. 日期插件kalendae,遇到的一些问题

    1.日期中文显示 /*_months : 'January_February_March_April_May_June_July_August_September_October_November_D ...

  9. HTMLFormElement获取表单里面所有的值然后以json形式返回

    function HTMLFormElement(){ this.init(); return this.json; } HTMLFormElement.prototype.init = functi ...

  10. 火狐中jq的attr出现的bug问题用prop代替

    再工作的时候遇到一个很奇怪的问题 ,就是attr属性不好使!就问度娘去了...... 结果如下: .prop()   1..prop( propertyName ) 获取匹配集合中第一个元素的Prop ...