iOS - HTTPS

作者:Mitchell 

一典勇、簡介


二筋夏、HTTPS與HTTP的區(qū)別

  • 這里用兩張圖來介紹兩者的區(qū)別:
    • HTTP:當(dāng)客戶端發(fā)送請求蒂胞,那么服務(wù)器會(huì)直接返回?cái)?shù)據(jù)。


      HTTP.png
    • HTTPS:當(dāng)客戶端第一次發(fā)送請求的時(shí)候条篷,服務(wù)器會(huì)返回一個(gè)包含公鑰的受保護(hù)空間(也成為證書)骗随,當(dāng)我們發(fā)送請求的時(shí)候,公鑰會(huì)將請求加密再發(fā)送給服務(wù)器赴叹,服務(wù)器接到請求之后鸿染,用自帶的私鑰進(jìn)行解密,如果正確再返回?cái)?shù)據(jù)乞巧。這就是 HTTPS 的安全性所在涨椒。


      HTTPS.png

三、實(shí)例

#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSURL *url = [NSURL URLWithString:@"https://kyfw.12306.cn/otn/leftTicket/init"];
//    NSURL *url = [NSURL URLWithString:@"https://www.apple.com/"];
//    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    [task resume];
}
#pragma mark - NSURLSessionDataDelegate
/*
// 只要訪問的是HTTPS的路徑就會(huì)調(diào)用
// 該方法的作用就是處理服務(wù)器返回的證書, 需要在該方法中告訴系統(tǒng)是否需要安裝服務(wù)器返回的證書
// NSURLAuthenticationChallenge : 授權(quán)質(zhì)問
//+ 受保護(hù)空間
//+ 服務(wù)器返回的證書類型
 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
//    NSLog(@"didReceiveChallenge");
//    NSLog(@"%@", challenge.protectionSpace.authenticationMethod);
    
    // 1.從服務(wù)器返回的受保護(hù)空間中拿到證書的類型
    // 2.判斷服務(wù)器返回的證書是否是服務(wù)器信任的
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        NSLog(@"是服務(wù)器信任的證書");
        // 3.根據(jù)服務(wù)器返回的受保護(hù)空間創(chuàng)建一個(gè)證書
//         void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *)
//         代理方法的completionHandler block接收兩個(gè)參數(shù):
//         第一個(gè)參數(shù): 代表如何處理證書
//         第二個(gè)參數(shù): 代表需要處理哪個(gè)證書
        //創(chuàng)建證書
        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        // 4.安裝證書   completionHandler(NSURLSessionAuthChallengeUseCredential , credential);    
    }
}
*/
 - (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
   //AFNetworking中的處理方式
    NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    __block NSURLCredential *credential = nil;  
    //判斷服務(wù)器返回的證書是否是服務(wù)器信任的
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        /*disposition:如何處理證書
     NSURLSessionAuthChallengePerformDefaultHandling:默認(rèn)方式處理
         NSURLSessionAuthChallengeUseCredential:使用指定的證書    NSURLSessionAuthChallengeCancelAuthenticationChallenge:取消請求
         */
        if (credential) {
            disposition = NSURLSessionAuthChallengeUseCredential;
        } else {
            disposition = NSURLSessionAuthChallengePerformDefaultHandling;
        }
    } else {
        disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
    }
    //安裝證書
    if (completionHandler) {
        completionHandler(disposition, credential);
    }
}
// 接收到服務(wù)器的響應(yīng)
 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    NSLog(@"didReceiveResponse");
    completionHandler(NSURLSessionResponseAllow);
}
// 接收到服務(wù)器返回的數(shù)據(jù)
 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData");
}
// 請求完畢
 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"didCompleteWithError");
}
@end

四绽媒、問題

  • 有時(shí)采用HTTPS 無法接受數(shù)據(jù)蚕冬,是因?yàn)樘O果將http使用的是TLS 1.2 SSL 加密請求數(shù)據(jù),而服務(wù)器有的時(shí)候使用的還是TLS 1.1
  • 解決辦法:在 info.plist 中添加
  • <key>NSAppTransportSecurity</key><dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/></dict>

打造安全的 APP HTTPS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是辕,一起剝皮案震驚了整個(gè)濱河市囤热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌获三,老刑警劉巖旁蔼,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異石窑,居然都是意外死亡牌芋,警方通過查閱死者的電腦和手機(jī)蚓炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門松逊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肯夏,你說我怎么就攤上這事经宏∠睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵烁兰,是天一觀的道長耐亏。 經(jīng)常有香客問我,道長沪斟,這世上最難降的妖魔是什么广辰? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮主之,結(jié)果婚禮上择吊,老公的妹妹穿的比我還像新娘。我一直安慰自己槽奕,他們只是感情好几睛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粤攒,像睡著了一般所森。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夯接,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天焕济,我揣著相機(jī)與錄音,去河邊找鬼钻蹬。 笑死吼蚁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的问欠。 我是一名探鬼主播肝匆,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顺献!你這毒婦竟也來了旗国?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤注整,失蹤者是張志新(化名)和其女友劉穎能曾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肿轨,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寿冕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椒袍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驼唱。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驹暑,靈堂內(nèi)的尸體忽然破棺而出玫恳,到底是詐尸還是另有隱情辨赐,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布京办,位于F島的核電站掀序,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惭婿。R本人自食惡果不足惜不恭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望财饥。 院中可真熱鬧县袱,春花似錦、人聲如沸佑力。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽打颤。三九已至暴拄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間编饺,已是汗流浹背乖篷。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留透且,地道東北人撕蔼。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像秽誊,于是被迫代替她去往敵國和親鲸沮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 快速適配直接看下面的示例代碼吧锅论,概念有點(diǎn)多讼溺。。最易。 自己客戶端生成證書放在服務(wù)器上怒坯,可以自簽服務(wù)器必須ca簽署,服務(wù)...
    _YZG_閱讀 10,927評論 0 56
  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,521評論 0 13
  • HTTPS協(xié)議 1. 作用 學(xué)名SSL/ TLS 協(xié)議藻懒,不使用SSL/TLS的HTTP通信剔猿,就是不加密的通信。所...
    弦暮閱讀 682評論 0 1
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,847評論 24 176
  • 原文地址:iOS安全系列之一:HTTPS 如何打造一個(gè)安全的App嬉荆?這是每一個(gè)移動(dòng)開發(fā)者必須面對的問題归敬。在移動(dòng)Ap...
    violafa閱讀 870評論 0 2