iOS對HTTPS證書鏈的驗(yàn)證

HTTPS從最終的數(shù)據(jù)解析的角度,與HTTP相同。HTTPS將HTTP協(xié)議數(shù)據(jù)包放到SSL/TSL層加密后,在TCP/IP層組成IP數(shù)據(jù)報(bào)去傳輸,以此保證傳輸數(shù)據(jù)的安全;而對于接收端,在SSL/TSL將接收的數(shù)據(jù)包解密之后,將數(shù)據(jù)傳給HTTP協(xié)議層什湘。

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

1.數(shù)字證書;
2.三個(gè)隨機(jī)數(shù);
3.加密通訊協(xié)議;
其通訊過程如下示意圖:


原理圖

數(shù)字證書

該證書一般是由服務(wù)器發(fā)送給客戶端,接收方通過驗(yàn)證這個(gè)證書是不是由信賴的CA簽發(fā),或者與本地的證書相對比,來判斷證書是否可信;假如需要雙向驗(yàn)證,則服務(wù)器和客戶端都需要發(fā)送數(shù)字證書給對方驗(yàn)證。
數(shù)字證書的生成是分層級的,從葉節(jié)點(diǎn)證書往根證書層層驗(yàn)證(有效期,簽名等等),遇到根證書時(shí),發(fā)現(xiàn)作為可信錨點(diǎn)的它存在于可信證書列表中,那么通過驗(yàn)證就通過脯颜。例如在鑰匙串中可以看到某券商公司申請的證書沒有在系統(tǒng)可信任的證書列表中伐脖。


鑰匙串訪問

下面以某浪sdk里的證書為代表簡單說明一下數(shù)字證書的內(nèi)容:

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

三個(gè)隨機(jī)數(shù)

這三個(gè)隨機(jī)數(shù)構(gòu)成了后續(xù)通信中用來對數(shù)據(jù)進(jìn)行對稱加密解密的"對話密鑰"。首先客戶端先發(fā)第一個(gè)隨機(jī)數(shù)n1,然后服務(wù)器返回第二個(gè)隨機(jī)數(shù)n2(這個(gè)過程同時(shí)把數(shù)字證書發(fā)給客戶端),這兩個(gè)隨機(jī)數(shù)都是用明文;而第三個(gè)隨機(jī)數(shù)n3,客戶端用數(shù)字證書的公鑰進(jìn)行非對稱性加密,發(fā)給服務(wù)器;而服務(wù)器用只有自己知道的私鑰來解密,獲取第三個(gè)隨機(jī)數(shù)蠕啄。服務(wù)端和客戶端都有了三個(gè)隨機(jī)數(shù)n1+n2+n3后,兩端就使用這三個(gè)隨機(jī)數(shù)來生成"對話密鑰",在此之后的通信就使用這個(gè)"對話密鑰"來進(jìn)行對稱加解密歼跟。

加密通信協(xié)議

雙方商量具體使用哪一種加密方式,假如兩者支持的加密方式不匹配,則無法進(jìn)行通信格遭。因?yàn)檫@個(gè)過程中,服務(wù)端的私鑰只用來解密第三個(gè)隨機(jī)數(shù),從來沒有在網(wǎng)絡(luò)中傳輸過,只要私鑰沒有被泄露,那么數(shù)據(jù)就是安全的拒迅。
下面主要介紹一下NSURLConnection支持HTTPS的實(shí)現(xiàn)設(shè)置證書作為可信的錨點(diǎn)代碼應(yīng)用。

// SDWebImageDownloaderOperation
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
//通過 challenge.protectionSpace.authenticationMethod 取得保護(hù)空間要求我們認(rèn)證的方式
    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];
        }
    }
}

StockPromotionViewController在webview中使用

- (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 這個(gè)類是表示身份驗(yàn)證憑據(jù)不可變對象。憑證的實(shí)際類型聲明的類的構(gòu)造函數(shù)來確定胞得〗捉#回調(diào)中會收到一個(gè)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];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末递宅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子办龄,更是在濱河造成了極大的恐慌俐填,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏檐,死亡現(xiàn)場離奇詭異驶悟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)硫豆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門熊响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汗茄,“玉大人铭若,你說我怎么就攤上這事。” “怎么了非迹?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵冷离,是天一觀的道長纯命。 經(jīng)常有香客問我,道長瞭空,這世上最難降的妖魔是什么咆畏? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任旧找,我火速辦了婚禮,結(jié)果婚禮上鞭缭,老公的妹妹穿的比我還像新娘岭辣。我一直安慰自己易结,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渣刷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箩溃。 梳的紋絲不亂的頭發(fā)上涣旨,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天股冗,我揣著相機(jī)與錄音,去河邊找鬼烹棉。 笑死浆洗,一個(gè)胖子當(dāng)著我的面吹牛伏社,可吹牛的內(nèi)容都是我干的抠刺。 我是一名探鬼主播矫付,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挺举!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脂崔,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤砌左,失蹤者是張志新(化名)和其女友劉穎汇歹,沒想到半個(gè)月后产弹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弯囊,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匾嘱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年折欠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗忱。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羊赵,靈堂內(nèi)的尸體忽然破棺而出趟佃,到底是詐尸還是另有隱情扇谣,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布闲昭,位于F島的核電站罐寨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏序矩。R本人自食惡果不足惜鸯绿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簸淀。 院中可真熱鬧瓶蝴,春花似錦、人聲如沸租幕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祷安,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霍骄,已是汗流浹背簿训。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工的榛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雕薪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像局劲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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