正確使用AFNetworking的SSL保證網絡安全

Reference: https://www.cainwang.cn/afnssl/??
AFNetworking, iOS開發中,以其優雅的結構設計和簡便的調用方式,使其成為了最流行的網絡開源庫之一(另一個應該算是ASI了,但經久失修不維護的原因,已經不是首選)。
??我們在大多數情況下,都能夠正確使用AFNetworking的功能,但在網絡安全日趨嚴峻的今天,加入SSL使用HTTPS已經成為了很多大中型網站的首選;這點在國外尤其流行,例如Google已經全站HTTPS。
??本文便主要描述了如何正確使用AFNetworking中的SSL功能。詳細步驟如下:
1、獲取到站點的證書:
??我們可以使用以下openssl命令來獲取到服務器的公開二進制證書(以google為例):

"openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer"

冒號中的為命令主要部分。該條命令將會在當前路徑下,形成google.com站點的公開二進制證書,命名為https.cer。您可以將www.google.com 替換成您自己的站點以此來獲取您自己站點的https.cer。

2、將證書放進我們的XCode項目工程中:


Paste_Image.png

??如上圖所示,將我們的https.cer拖到我們的工程Supporting Files中,把 Copy Items if needed 的勾選上。然后把您的Add to targets 選上,點擊確定。就完成了證書的導入工作。

3、在我們的代碼中使用我們的cer
??AFNetworking中的AFSecurityPolicy是主要的類,我們可以這樣來使用它(AFNetworking 2.6.0之前):

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    NSString *cerPath                = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];
    NSData *certData                 = [NSData dataWithContentsOfFile:cerPath];
    AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
    [securityPolicy setAllowInvalidCertificates:NO];
    [securityPolicy setPinnedCertificates:@[certData]];
    [securityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];
    [securityPolicy setValidatesDomainName:YES];
    [securityPolicy setValidatesCertificateChain:NO];

    manager.securityPolicy = securityPolicy;

解析:
1)新建一個manager, 地球人都知道
2)在mainBundle中尋找我們剛才拖進項目中的https.cer, 并且將相關的數據讀取出來
3)新建一個AFSecurityPolicy,并進行相應的配置
4)將這個AFSecurityPolicy 實例賦值給manager

也可以這樣來使用:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init]; 
[securityPolicy setAllowInvalidCertificates:NO]; 
[securityPolicy setSSLPinningMode:AFSSLPinningModeCertificate]; 
[securityPolicy setValidatesDomainName:YES];
[securityPolicy setValidatesCertificateChain:NO]; 

manager.securityPolicy = securityPolicy;

這種方式比前面那種方式要更加簡便一些,主要原因在于AFNetworking會自動去搜索mainBundle下的所有cer結尾的文件并放進內存中;再一一對比。因此在代碼中可以省略不寫。

這樣一個網絡請求的https的安全策略就配置好了,接下來再說明一下幾個AFSecurityPolicy相關的配置
1> SSLPinningMode
SSLPinningMode 定義了https連接時,如何去校驗服務器端給予的證書。

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    AFSSLPinningModeNone,
    AFSSLPinningModePublicKey,
    AFSSLPinningModeCertificate,
};

AFSSLPinningModeNone: 代表客戶端無條件地信任服務器端返回的證書。
AFSSLPinningModePublicKey: 代表客戶端會將服務器端返回的證書與本地保存的證書中,PublicKey的部分進行校驗;如果正確,才繼續進行。
AFSSLPinningModeCertificate: 代表客戶端會將服務器端返回的證書和本地保存的證書中的所有內容,包括PublicKey和證書部分,全部進行校驗;如果正確,才繼續進行。

2> allowInvalidCertificates
??allowInvalidCertificates 定義了客戶端是否信任非法證書。一般來說,每個版本的iOS設備中,都會包含一些既有的CA根證書。如果接收到的證書是iOS信任的CA根證書簽名的,那么則為合法證書;否則則為“非法”證書。
??allowInvalidCertificates 就是用來確認是否信任這樣的證書的。當然,我們也可以給iOS加入新的信任的CA證書。iOS已有的CA根證書,可以在這里了解到:https://support.apple.com/en-us/HT204132

3> pinnedCertificates
??pinnedCertificates 就是用來校驗服務器返回證書的證書。通常都保存在mainBundle 下。通常默認情況下,AFNetworking會自動尋找在mainBundle的根目錄下所有的.cer文件并保存在pinnedCertificates數組里,以校驗服務器返回的證書。

4> validatesDomainName
??validatesDomainName 是指是否校驗在證書中的domain這一個字段。每個證書都會包含一個DomainName, 它可以是一個IP地址,一個域名或者一端帶有通配符的域名。如*.google.com, www.google.com 都可以成為這個證書的DomainName。設置validatesDomainName=YES將嚴格地保證其安全性。

5> validatesCertificateChain
??validatesCertificateChain 指的是是否校驗其證書鏈。
??通常來講,一個CA證書頒發機構有很多個子機構,用來簽發不同用途的子證書,然后這些子證書又再用來簽發相應的證書。只有證書鏈上的證書都正確,CertificateChain才算驗證完成。以Google為例:

Paste_Image.png

從上圖可以看到,Google.com的證書的根CA證書是GeoTrust Global CA; 而CA并沒有直接給google.com簽證書,而是先簽名了Google Internet Authority G2, 然后G2再簽名了google.com。這時候就需要設備中保存有Google Internet Authority G2證書才能通過校驗。
??一般來講,我推薦將validatesCertificateChain設置為NO,因為并不是太有必要做CertificateChain的校驗。并且,在AFNetworking 2.6.0中,也正式將validatesCertificateChain拿掉了(https://github.com/AFNetworking/AFNetworking/blob/master/CHANGELOG.md), 其原因也同樣為:There was no documented security advantage to pinning against an entire certificate chain。
??因此,在2.6.0之后,可以不管這個字段。而在此之前,從效率上來說,設定為NO會是個比較明智的選擇。

做好以上工作后,您應該就可以正常訪問您自己的https服務器了。如果還是有問題請檢查:
(1)、HTTPS服務器的正確配置。一般來說,可以使用瀏覽器打開相同頁面來查看瀏覽器上的小鎖是否正常。
(2)、是否https.cer正確打包進了項目中。查看第2步中的內容。
(3)、其他。跟帖唄。有問題大家一起交流,共同進步:)

這幾個東西別看就這么一點,理解了好久才理清楚其中代表的含義。接下來打算再寫幾篇關于SSL的詳細博文以紀念這些深度研究的時間。

參考文檔:
1、https://github.com/AFNetworking/AFNetworking/blob/master/CHANGELOG.md
2、http://nelson.logdown.com/posts/2015/04/29/how-to-properly-setup-afnetworking-security-connection/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 一、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文傳播,帶來了三大風險。 (1)竊聽風險...
    XLsn0w閱讀 10,607評論 2 44
  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,545評論 0 13
  • 這篇文章是我一邊學習證書驗證一邊記錄的內容,稍微整理了下,共扯了三部分內容: HTTPS 簡要原理;數字證書的內容...
    左邊飛來一只狗閱讀 3,338評論 2 5
  • iOS安全系列之一:HTTPS 2014-10-21 如何打造一個安全的App?這是每一個移動開發者必須面對的問題...
    不作不會死閱讀 763評論 0 4
  • 清風起,明月夜,樓里佳人樓外念,幾時回,歸期不見,空億往昔顏。 愁思遠,淚無痕,小巷油傘花依舊,人未見,古琴無聲,...
    李子樹下豬正酣閱讀 215評論 2 0