iOS對HTTPS證書鏈的驗證

本文由我們團隊的美女 超哥 分享


HTTPS從最終的數據解析的角度,與HTTP相同钾埂。HTTPS將HTTP協(xié)議數據包放到SSL/TSL層加密后科平,在TCP/IP層組成IP數據報去傳輸,以此保證傳輸數據的安全瞪慧;而對于接收端,在SSL/TSL將接收的數據包解密之后氨菇,將數據傳給HTTP協(xié)議層妓湘。

SSL/TSL包括四次握手,主要交換三個信息:

  1. 數字證書豌研;
  2. 三個隨機數唬党;
  3. 加密通訊協(xié)議。

其通訊過程如下示意圖:

數字證書

該證書一般是由服務器發(fā)給客戶端,接收方通過驗證這個證書是不是由信賴的CA簽發(fā)屯烦,或者與本地的證書相對比房铭,來判斷證書是否可信;假如需要雙向驗證缸匪,則服務器和客戶端都需要發(fā)送數字證書給對方驗證。
數字證書的生成是分層級的露懒,從葉節(jié)點證書往根證書層層驗證(有效期、簽名等等)蛇耀,遇到根證書時坎弯,發(fā)現作為可信錨點的它存在與可信證書列表中,那么驗證就通過撩炊。例如在鑰匙串中可以看到某券商公司申請的證書沒有在系統(tǒng)可信任的證書列表中崎脉。

下面以?某浪sdk里的證書為代表簡單說明一下數字證書的內容:

證書字段 證書說明
簽發(fā)者名稱 發(fā)布并簽署該證書的實體的信息
序列號 數字證書機構(Certificate Authority, CA)給證書的唯一整數荧嵌,一個數字證書一個序列號
主題名稱 用于識別該數字證書的信息
公共密鑰信息 可公開的密鑰信息
簽名 通過簽名算法計算證書內容后得到的數據,用于驗證證書是否被篡改

三個隨機數

這三個隨機數構成了后續(xù)通信過程中用來對數據進行對稱加密解密的“對話密鑰”谭网。首先客戶端先發(fā)第一個隨機數n1赃春,然后服務器返回第二個隨機數n2(這個過程同時把數字證書發(fā)給客戶端),這兩個隨機數都是明文的锥涕;而第三個隨機數n3狭吼,客戶端用數字證書的公鑰進行非對稱加密破花,發(fā)給服務器疲吸;而服務器用只有自己知道的私鑰來解密摘悴,獲取第三個隨機數。服務端和客戶端都有了三個隨機數n1+n2+n3后蹂喻,兩端就使用這三個隨機數來生成“對話密鑰”捂寿,在此之后的通信就使用這個“對話密鑰”來進行對稱加解密挫以。

加密通信協(xié)議

雙方商量具體使用哪一種加密方式,假如兩者支持的加密方式不匹配踱侣,則無法進行通信大磺。因為這個過程中,服務端的私鑰只用來解密第三個隨機數待榔,從來沒有在網絡中傳輸過流济,只要私鑰沒有被泄露,那么數據就是安全的雕憔。

下邊主要介紹一下NSURLConnection支持HTTPS的實現設置證書作為可信的錨點代碼應用糖声。

// SDWebImageDownloaderOperation

(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
//通過 challenge.protectionSpace.authenticationMethod 取得保護空間要求我們認證的方式
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates) &&
            [challenge.sender respondsToSelector:@selector(performDefaultHandlingForAuthenticationChallenge:)]) {
            [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];
        } else {
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
        }
    } else {
        if ([challenge previousFailureCount] == 0) {
            if (self.credential) {
                [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge];
            } else {
                [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];
            }
        } else {
            [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];
        }
    }
}

StockPromotionViewControllerwebview中使用

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

      NSString* scheme = [[request URL] scheme];
    //判斷是不是https
    if ([scheme isEqualToString:@"https"])
    {
        if (self.authed)
        {
            return YES;
        }
        NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:request.URL] delegate:self];
        [conn start];
        [webView stopLoading];
        return NO;
    }
    return YES;
}

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount]== 0)
    {
        self.authed = YES;
        //NSURLCredential 這個類是表示身份驗證憑據不可變對象蘸泻。憑證的實際類型聲明的類的構造函數來確定〔⑸龋回調中會收到一個challenge
        NSURLCredential* cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        [challenge.sender useCredential:cre forAuthenticationChallenge:challenge];
    }
}

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
    return request;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.authed = YES;
    //webview 重新加載請求抡诞。
    [self.webView loadRequest:[NSURLRequest requestWithURL:connection.currentRequest.URL]];
   [connection cancel];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沐绒,一起剝皮案震驚了整個濱河市旺坠,隨后出現的幾起案子,更是在濱河造成了極大的恐慌蹋肮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馁龟,死亡現場離奇詭異漆魔,居然都是意外死亡,警方通過查閱死者的電腦和手機改抡,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門阿纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欠拾,你說我怎么就攤上這事∽拭粒” “怎么了枷邪?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵东揣,是天一觀的道長。 經常有香客問我嘶卧,道長,這世上最難降的妖魔是什么侦铜? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任钟鸵,我火速辦了婚禮,結果婚禮上贡未,老公的妹妹穿的比我還像新娘。我一直安慰自己俊卤,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布岂昭。 她就那樣靜靜地躺著狠怨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棍苹。 梳的紋絲不亂的頭發(fā)上茵汰,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蹂午,我揣著相機與錄音,去河邊找鬼豆胸。 笑死,一個胖子當著我的面吹牛灵奖,可吹牛的內容都是我干的估盘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擅编,長吁一口氣:“原來是場噩夢啊……” “哼箫踩!你這毒婦竟也來了?” 一聲冷哼從身側響起境钟,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慨削,失蹤者是張志新(化名)和其女友劉穎鱼的,沒想到半個月后痘煤,有當地人在樹林里發(fā)現了一具尸體猿规,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡姨俩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了调窍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张遭。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缔恳,靈堂內的尸體忽然破棺而出洁闰,到底是詐尸還是另有隱情,我是刑警寧澤扑眉,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布腰素,位于F島的核電站,受9級特大地震影響耸弄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜砰诵,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一捌显、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧理肺,春花似錦、人聲如沸妹萨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽树姨。三九已至,卻和暖如春帽揪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背转晰。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挽霉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓蚁趁,卻偏偏與公主長得像实胸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庐完,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容