iOS SSL Pinning 保護你的 API

隨着互聯網的發展,網站全面 https 化已經愈來愈被重視,作爲 App 開發人員,從一開始就讓 API 都走 SSL 也是十分必要的。可是光這樣就足夠了嗎?api

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工具

更多網易研發、產品、運營經驗分享請訪問網易雲社區。 測試

相關文章
相關標籤/搜索