随着互联网的发展,网站全面 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. git branch 相关操作总结 新建分支 删除分支 切换分支 查看分支

    查看分支 (1) 查看本地分支  git branch 列出本地已经存在的分支,并且在当前分支的前面加*号标记,例如:localhost:website admin$ git branch* bran ...

  2. 禁用U盘的两种方法

    方法一:注册表 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Services\USBSTOR 更改值为4即可,恢复时同理 ,重启即可 方法二:组策略

  3. viewsate用法

    ViewState["名称"]="ssss";直接赋值取值只能在同一个页面使用, 离开页面就会失效

  4. shiro之cache问题

    错误原因分析加解决方案,以供大家参考: 1.错误信息:net.sf.ehcache.ObjectExistsException: Cache shiro-activeSessionCache alre ...

  5. C#与C++通过socket传送结构体

    C#服务端: using System; using System.Net.Sockets; using System.Net; using System.IO; using System.Diagn ...

  6. Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

    一.意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径. 其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释 ...

  7. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  8. Cannot set HTTP gem source: “source https://rubygems.org not present in cache”

    My ruby version in Windows 10: > ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [i386-mingw32 ...

  9. 纯 js 让浏览器不缓存 ajax 请求

    开发「bufpay.com 个人即时到账收款平台」支付页面需要用到 ajax 轮询订单的支付状态. 现在浏览器对 ajax 的缓存策略遵循 http response header 里面的缓存设置,为 ...

  10. C++笔记009:C++对C的扩展——“实用性”增加

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 笔记八中已经说到:在 C语言中定义了3个层次的作用域,即文件(编译单元).函数和复合语句. C语言中的变量都必须在作用域开始的位置定义! ...