精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

打造安全的App!iOS安全系列之 HTTPS 進階

移動開發(fā)
關(guān)于HTTPS,我經(jīng)常會提到的就是中間人攻擊,那究竟什么是中間人攻擊呢?中間人攻擊,即所謂的Main-in-the-middle attack(MITM),顧名思義,就是攻擊者插入到原本直接通訊的雙方,讓雙方以為還在直接跟對方通訊,但實際上雙方的通訊對方已變成了中間人,信息已經(jīng)是被中間人獲取或篡改。

[[149556]]

本文分為以下四節(jié):

  1. 中間人攻擊:介紹中間人攻擊常見方法,并模擬了一個簡單的中間人攻擊;

  2. 校驗證書的正確姿勢:介紹校驗證書的一些誤區(qū),并討論了正確校驗方式;

  3. ATS:討論下 iOS 9.0 新發(fā)布的的特性App Transport Security;

  4. 調(diào)試SSL/TLS:討論使用Wireshark進行SSL/TLS調(diào)試的方法;

其中第1節(jié)“中間人”是比較常見基礎(chǔ)的知識,網(wǎng)上也可以找到相關(guān)的資料,如果對中間人攻擊已經(jīng)有了足夠的了解,可以跳過。后面幾節(jié)則是個人在iOS方面的實踐總結(jié),除了一些與系統(tǒng)相關(guān)的特性外,大部分都是系統(tǒng)無關(guān)的通用知識,有點干貨。

1. 中間人攻擊

關(guān)于HTTPS,我經(jīng)常會提到的就是中間人攻擊,那究竟什么是中間人攻擊呢?中間人攻擊,即所謂的Main-in-the-middle attack(MITM),顧名思義,就是攻擊者插入到原本直接通訊的雙方,讓雙方以為還在直接跟對方通訊,但實際上雙方的通訊對方已變成了中間人,信息已經(jīng)是被中間人獲取或篡改。

blob.png

當(dāng)然,本文并不是科普性文章,本節(jié)就針對HTTPS攻擊,特別是HTTPS在App這一應(yīng)用場景下的常見的攻擊手段進行分析討論。

由前文我們知道,HTTPS在建立了TCP連接之后,會進行SSL握手(SSL Handshake)來校驗證書,協(xié)商加密協(xié)議和對稱加密的密鑰,之后就會使用協(xié)商好的密鑰來進行傳輸。所以HTTPS攻擊一般分為SSL連接建立前的攻擊,以及HTTPS傳輸過程中的攻擊;

常見的HTTPS中間人攻擊,首先需要結(jié)合ARP、DNS欺騙等技術(shù),來對會話進行攔截,

1.1 SSL證書欺騙攻擊

此類攻擊較為簡單常見。首先通過ARP欺騙、DNS劫持甚至網(wǎng)關(guān)劫持等等,將客戶端的訪問重定向到攻擊者的機器,讓客戶端機器與攻擊者機器建立HTTPS連接(使用偽造證書),而攻擊者機器再跟服務(wù)端連接。這樣用戶在客戶端看到的是相同域名的網(wǎng)站,但瀏覽器會提示證書不可信,用戶不點擊繼續(xù)瀏覽就能避免被劫持的。所以這是最簡單的攻擊方式,也是最容易識別的攻擊方式。

此類攻擊有個經(jīng)典的工具:SSLSniff。SSLSniff是大神Moxie Marlinspike開發(fā)的工具,該工具一開始是設(shè)計用于上一篇文章中提到的Basic Constaints 漏洞的,這類系統(tǒng)級別的漏洞,基本上可以讓你不知不覺;現(xiàn)在的操作系統(tǒng)和瀏覽器基本修復(fù)了這一漏洞。但也可以使用SSLSniff來偽造證書實現(xiàn)釣魚攻擊。

blob.png

防范措施:

釣魚類攻擊,App直接調(diào)用系統(tǒng)API創(chuàng)建的HTTPS連接(NSURLConnection)一般不會受到影響,只使用默認(rèn)的系統(tǒng)校驗,只要系統(tǒng)之前沒有信任相關(guān)的偽造證書,校驗就直接失敗,不會SSL握手成功;但如果是使用WebView瀏覽網(wǎng)頁,需要在UIWebView中加入較強的授權(quán)校驗,禁止用戶在校驗失敗的情況下繼續(xù)訪問。

1.2 SSL剝離攻擊(SSLStrip

SSL剝離,即將HTTPS連接降級到HTTP連接。假如客戶端直接訪問HTTPS的URL,攻擊者是沒辦法直接進行降級的,因為HTTPS與HTTP雖然都是TCP連接,但HTTPS在傳輸HTTP數(shù)據(jù)之前,需要在進行了SSL握手,并協(xié)商傳輸密鑰用來后續(xù)的加密傳輸;假如客戶端與攻擊者進行SSL握手,而攻擊者無法提供可信任的證書來讓客戶端驗證通過進行連接,所以客戶端的系統(tǒng)會判斷為SSL握手失敗,斷開連接。

該攻擊方式主要是利用用戶并不會每次都直接在瀏覽器上輸入https://xxx.xxx.com來訪問網(wǎng)站,或者有些網(wǎng)站并非全網(wǎng)HTTPS,而是只在需要進行敏感數(shù)據(jù)傳輸時才使用HTTPS的漏洞。中間人攻擊者在劫持了客戶端與服務(wù)端的HTTP會話后,將HTTP頁面里面所有的https://超鏈接都換成http://,用戶在點擊相應(yīng)的鏈接時,是使用HTTP協(xié)議來進行訪問;這樣,就算服務(wù)器對相應(yīng)的URL只支持HTTPS鏈接,但中間人一樣可以和服務(wù)建立HTTPS連接之后,將數(shù)據(jù)使用HTTP協(xié)議轉(zhuǎn)發(fā)給客戶端,實現(xiàn)會話劫持。

這種攻擊手段更讓人難以提防,因為它使用HTTP,不會讓瀏覽器出現(xiàn)HTTPS證書不可信的警告,而且用戶很少會去看瀏覽器上的URL是https://還是http://。特別是App的WebView中,應(yīng)用一般會把URL隱藏掉,用戶根本無法直接查看到URL出現(xiàn)異常。

blob.png

防范措施:

該種攻擊方式同樣無法劫持App內(nèi)的HTTPS連接會話,因為App中傳入請求的URL參數(shù)是固定帶有https://的;但在WebView中打開網(wǎng)頁同樣需要注意,在非全網(wǎng)HTTPS的網(wǎng)站,建議對WebView中打開的URL做檢查,檢查應(yīng)該使用https://的URL是否被篡改為http://;也建議服務(wù)端在配置HTTPS服務(wù)時,加上“HTTP Strict Transport Security”配置項。

參考:【流量劫持】躲避HSTS的HTTPS劫持

1.3 針對SSL算法進行攻擊

上述兩種方式,技術(shù)含量較低,而且一般只能影響 WebApp,而很難攻擊到 Native App , 所以高階的 Hacker,會直接針對SSL算法相關(guān)漏洞進行攻擊,期間會使用很多的密碼學(xué)相關(guān)手段。由于本人非專業(yè)安全相關(guān)人員,沒有多少相關(guān)實踐經(jīng)驗,所以本節(jié)不會深入講解相關(guān)的攻擊原理和手段,有興趣的同學(xué)可以查看以下拓展閱讀:

防范措施:

這類攻擊手段是利用SSL算法的相關(guān)漏洞,所以最好的防范措施就是對服務(wù)端 SSL/TLS 的配置進行升級:

  • 只支持盡量高版本的TLS(最低TLS1);

  • 禁用一些已爆出安全隱患的加密方法;

  • 使用2048位的數(shù)字證書;

1.4 模擬最簡單的攻擊

經(jīng)過上述幾種攻擊方式的說明之后,我們來模擬下最簡單的中間人攻擊。

中間人攻擊步驟方式的上文已經(jīng)說過了,流量劫持相關(guān)操作不是本文重點,可以參考流量劫持是如何產(chǎn)生的?, 本例直接使用Charles來做代理,對流量進行劫持。并使用SSL代理來模擬下對iPhone設(shè)備HTTPS請求的中間人攻擊,讓大家在思考理解中間人攻擊方式的同時,了解在開發(fā)中如何防范類似的攻擊。

1) Charles設(shè)置代理

在Charles中開啟并設(shè)置HTTP代理和SSL代理,Menu -> Proxy -> Proxy Setting,設(shè)置如圖:

HTTP代理設(shè)置,注意記住端口號為:8888

blob.png

SSL代理設(shè)置,在Locations上可以設(shè)置想要進行SSL代理的域名,這里以百度的百付寶*.baifubao.com為模擬對象。

blob.png

2) 在iPhone端設(shè)置HTTP代理

在Mac上獲取當(dāng)前機器的IP地址:

ifconfig en0:

blob.png

還有一個簡單的方法,按住option+點擊頂部菜單欄的WiFi網(wǎng)絡(luò)圖標(biāo):

blob.png

可以看到當(dāng)前電腦的IP地址為:192.168.199.249。

將iPhone連接到與電腦相同的WiFi,在iPhone設(shè)置中:無線局域網(wǎng) -> 已連接WiFi右邊的Info詳情圖標(biāo) -> HTTP代理 -> 手動 -> 設(shè)置HTTP代理:

blob.png

設(shè)置完成之后,打開Safari隨便訪問一個網(wǎng)頁,初次設(shè)置代理的話,Charles會彈出一個iPhone請求代理的確認(rèn)框,點擊Allow即可。然后在Charles上就可以看到iPhone上的HTTP請求了。為了避免Mac上的請求過多影響對被代理iPhone上HTTP請求的查看和調(diào)試,可以在Charles取消Mac的代理:Menu -> Proxy -> 取消勾選Mac OS X Proxy 即可。

假如你訪問的是被代理的目標(biāo) URL http://www.baifubao.com 則打不開網(wǎng)頁。因為iPhone的HTTPS請求已經(jīng)被Charles攔截,但iPhone無法信任Charles的證書,所以SSL Handshake失敗,無法建立HTTPS連接。

blob.png

3) 偽造證書欺騙

在被代理的iPhone上打開Safari,訪問http://www.charlesproxy.com/getssl,會彈出安裝描述符文件的界面,該描述文件包含了Charles根證書:

blob.png

注意:這個Charles證書是內(nèi)置在Charles中的,可以在菜單Help -> SSL Proxying可以直接保存和安裝證書。安裝后的描述文件可以在iPhone設(shè)備的設(shè)置 -> 通用 -> 描述文件進行查看和管理。

“安裝”完成之后,就會將Charles根證書加入系統(tǒng)可信任證書列表中,使用該證書簽發(fā)的子證書也會被系統(tǒng)信任。Charles會為之前SSL代理設(shè)置中配置的域名生成對應(yīng)的SSL證書,這樣偽造證書的證書就實現(xiàn)了欺騙。可以使用Mac SSL代理查看下:

blob.png

4) 結(jié)果驗證

下載百度App,然后登錄賬號,在我 -> 我的錢包,就會訪問百付寶:

blob.png

看到已成功獲取到HTTPS請求包的內(nèi)容。從這里,我們可以猜測出該App是使用系統(tǒng)默認(rèn)的校驗方式:系統(tǒng)信任了這個中間人服務(wù)器返回的SSL證書,App就信任了這一校驗,SSL握手成功;而沒有對服務(wù)器證書進行本地對比校驗。這是當(dāng)下非常多App存在的安全隱患。

這個簡單的SSL代理模擬了簡單釣魚式的中間人攻擊,大家應(yīng)該都基本明白了這種攻擊方式的所針對的漏洞,以及防范這種攻擊方法的措施:

  • 不要隨意連入公共場合內(nèi)的WiFi,或者使用未知代理服務(wù)器

  • 不要安裝不可信或突然出現(xiàn)的描述文件,信任偽造的證書;

  • App內(nèi)部需對服務(wù)器證書進行單獨的對比校驗,確認(rèn)證書不是偽造的;

#p#

2. 校驗證書的正確姿勢

上一節(jié)對中間人攻擊進行了簡單介紹,本節(jié)就上一節(jié)我們遇到的安全隱患問題,來討論下在App中,應(yīng)該怎么校驗服務(wù)器返回的SSL證書,來保證HTTPS通信的安全。上一篇文章《iOS安全系列之一:HTTPS》有對基本校驗過程相關(guān)代碼進行講解,本文不會贅述這些細節(jié),而是主要討論校驗證書中幾個重要的點:

2.1 域名驗證

前不久,iOS上最知名的網(wǎng)絡(luò)開源庫AFNetworking爆出HTTPS校驗漏洞,該漏洞是因為其校驗策略模塊 AFSecurityPolicy 內(nèi)的參數(shù) validatesDomainName 默認(rèn)為NO,這會導(dǎo)致校驗證書的時候不會校驗這個證書對應(yīng)的域名。即請求返回的服務(wù)器證書,只要是可信任CA機構(gòu)簽發(fā)的,都會校驗通過,這是非常嚴(yán)重的漏洞。該漏洞已在v2.5.2版本中修復(fù),對應(yīng)Git版本號3e631b203dd95bb82dfbcc2c47a2d84b59d1eeb4。

這個漏洞以及AFNetworking的相關(guān)源碼會讓很多人以為系統(tǒng)的默認(rèn)校驗是不校驗證書對應(yīng)域名的,實際上并非如此。這里AFNetworking確有畫蛇添足之嫌。首先我們查看下系統(tǒng)的默認(rèn)校驗策略:


  1. - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
  2.     //1)獲取trust object 
  3.     SecTrustRef trust = challenge.protectionSpace.serverTrust; 
  4.     //獲取默認(rèn)的校驗策略 
  5.     CFArrayRef defaultPolicies = NULL; 
  6.     SecTrustCopyPolicies(serverTrust, &defaultPolicies); 
  7.     NSLog(@"Default Trust Policies: %@", (__bridge id)defaultPolicies); 
  8.     //... 

打印默認(rèn)校驗策略信息:


  1. 5 :{contents = "ValidRoot"} ={value = true
  2. 6 :{contents = "SSLHostname"} ={contents = "xxx.xxx.com"
  3. 8 :{contents = "ValidLeaf"} ={value = true

從打印信息來看,系統(tǒng)的默認(rèn)校驗策略中已包含了域名校驗。然后再看AFSecurityPolicy中相關(guān)源碼:


  1. - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust 
  2.                   forDomain:(NSString *)domain 
  3.     NSMutableArray *policies = [NSMutableArray array]; 
  4.     if (self.validatesDomainName) { 
  5.         [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; 
  6.     } else { 
  7.         [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; 
  8.     } 
  9.     SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); 
  10.     //... 

這其實也是很多開發(fā)者在處理異常與默認(rèn)邏輯分支時會犯的錯誤,這段邏輯推薦實現(xiàn)方式是:


  1. //取代validatesDomainName,默認(rèn)為NO,就是系統(tǒng)默認(rèn)行為 
  2. @property (nonatomic, assign) BOOL skipDomainNameValidation; 
  3. //校驗 
  4. - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust 
  5.                   forDomain:(NSString *)domain 
  6.     if (self.skipDomainNameValidation) { 
  7.         NSMutableArray *policies = [NSMutableArray array]; 
  8.         [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; 
  9.         SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); 
  10.     } 
  11.     //... 

從代碼上看,邏輯是否變得更清晰了?而且也表明系統(tǒng)默認(rèn)的校驗方式是會驗證域名的。實際上SecTrustSetPolicies重新設(shè)置校驗策略是用于使用IP進行HTTPS請求,或者一個證書用于多個域名的場景;在這些場景下,服務(wù)器證書上的域名和請求域名就會出現(xiàn)不一致,導(dǎo)致校驗不通過;這就需要重新設(shè)置下校驗策略,把這個證書對應(yīng)的域名設(shè)置下。詳細說明請查看官方文檔:《Overriding TLS Chain Validation Correctly》

2.2 校驗證書鏈?

上一篇文章介紹系統(tǒng)驗證SSL證書的方法和流程時,不是已經(jīng)說明了會對證書鏈進行層層校驗,已保證證書的可信么?為什么還需要討論這一問題?其實本節(jié)要討論的是AFNetworking中validatesCertificateChain的問題。

首先說明下結(jié)果:在AFNetworking最新發(fā)布的V2.6.0,已經(jīng)將該特性去掉了。相關(guān)的討論:SSL Pinning: What Should Be Certificate Chain Validation Expected Behavior?#2744

AFNetworking中實現(xiàn)的驗證證書鏈,是講App本地打包好的證書與服務(wù)器返回的證書鏈進行數(shù)據(jù)上的一一對比,只有本地打包好的證書中包含了服務(wù)器返回的證書鏈上的所有證書,校驗才會通過。如google的SSL證書:

blob.png

開啟validatesCertificateChain請求https://google.com,則需要將GeoTrust Global CA、Google Internet Authority G2和google.com的證書都導(dǎo)入App中才能驗證通過。請回憶下上一篇文章關(guān)于證書鏈的可信任機制,會發(fā)現(xiàn)這是完全沒有必要的;證書鏈的驗證,主要由三部分來保證證書的可信:葉子證書是對應(yīng)HTTPS請求域名的證書,根證書是被系統(tǒng)信任的證書,以及這個證書鏈之間都是層層簽發(fā)的;這些就是系統(tǒng)驗證的步驟,也就是系統(tǒng)確人使用該證書的服務(wù)器是請求域名對應(yīng)的服務(wù)器。經(jīng)過系統(tǒng)驗證通過的證書鏈,兩端被確認(rèn)可信,那中間的任一節(jié)點也是可信的,不需要把中間節(jié)點都一一對比驗證。

2.3打包證書校驗

那是否就不需要在App本地打包證書進行驗證了呢? 這時需要想想為什么偽造證書是可以實現(xiàn)中間人攻擊的?答案就在于用戶讓系統(tǒng)信任了不應(yīng)該信任的證書。用戶設(shè)置系統(tǒng)信任的證書,會作為錨點證書(Anchor Certificate)來驗證其他證書,當(dāng)返回的服務(wù)器證書是錨點證書或者是基于該證書簽發(fā)的證書(可以是多個層級)都會被信任。所以我們不能完全相信系統(tǒng)的校驗,因為系統(tǒng)的校驗對比的源很可能被污染了。

所以還是需要App本地打包證書,使用SecTrustSetAnchorCertificates(SecTrustRef trust, CFArrayRef anchorCertificates)來設(shè)置Anchor Certificate進行校驗。需要注意的是,官方文檔《Certificate, Key, and Trust Services Reference》針對傳入的 Anchor Certificates 有說明:

IMPORTANT
Calling this function without also calling SecTrustSetAnchorCertificatesOnly disables the trusting of any anchors other than the ones specified by this function call.

也就是說,單純調(diào)用SecTrustSetAnchorCertificates方法后不調(diào)用SecTrustSetAnchorCertificatesOnly來驗證證書,則只會相信SecTrustSetAnchorCertificates傳入的證書,而不會信任其他錨點證書。關(guān)于這一點,SecTrustSetAnchorCertificatesOnly方法參數(shù)講解中也有說明:

anchorCertificatesOnly:
If true, disables trusting any anchors other than the ones passed in with the SecTrustSetAnchorCertificates function.  If false, the built-in anchor certificates are also trusted. If SecTrustSetAnchorCertificates is called and SecTrustSetAnchorCertificatesOnly is not called, only the anchors explicitly passed in are trusted.

只相信傳入的錨點證書,也就只會驗證通過由這些錨點證書簽發(fā)的證書。這樣就算被驗證的證書是由系統(tǒng)信任的錨點證書簽發(fā)的,也無法驗證通過。

最后一個問題:選擇證書鏈的哪一節(jié)點作為錨點證書打包到App中呢?很多開發(fā)者會直接選擇葉子證書。其實對于自建證書來說,選擇哪一節(jié)點都是可行的。而對于由CA頒發(fā)的證書,則建議導(dǎo)入頒發(fā)該證書的CA機構(gòu)證書或者是更上一級CA機構(gòu)的證書,甚至可以是根證書。這是因為:

1) 一般葉子證書的有效期都比較短,Google和Baidu官網(wǎng)證書的有效期也就幾個月;而App由于是客戶端,需要一定的向后兼容,稍疏于檢查,今天發(fā)布,過兩天證書就過期了。

2) 越往證書鏈的末端,證書越有可能變動;比如葉子證書由特定域名(aaa.bbb.com)改為通配域名(*.bbb.com)等等。短期內(nèi)的變動,重新部署后,有可能舊版本App更新不及時而出現(xiàn)無法訪問的問題。

因此使用CA機構(gòu)證書是比較合適的,至于哪一級CA機構(gòu)證書,暫時并沒有定論。

3. ATS

在本文發(fā)表的時間(2015-09-03),大部分的iOS開發(fā)同學(xué)應(yīng)該升級到iOS9了,在iOS9下進行HTTP/HTTPS請求時會遇到如下錯誤:

Request failed: Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo=0x7fbb4a158f00 {NSUnderlyingError=0x7fbb4a1141c0 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.", NSErrorFailingURLStringKey=http://api.xxx.com/mobile, NSErrorFailingURLKey=http://api.xxx.com/mobile, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}

這是iOS9中一個重大的更新:App Transport Security,簡稱ATS。ATS對使用NSURLConnection, CFURL, 或NSURLSession 等 APIs 進行網(wǎng)絡(luò)請求的行為作了一系列的強制要求,反逼服務(wù)器配置,以提高網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)陌踩裕?/p>

These are the App Transport Security requirements:
1) The server must support at least Transport Layer Security (TLS) protocol version 1.2.
2) Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
3) Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection.

ATS要求運行在iOS9的App,需將HTTP連接升級到HTTPS,并且TLS版本不得低于v1.2;而且規(guī)定了支持的密碼套件(Cipher Suite)和證書簽名的哈希算法;如果想要向前兼容的話,可以通過設(shè)置Info.plist來降低校驗強度,具體可以看這篇文章:Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11

當(dāng)前日益復(fù)雜脆弱的網(wǎng)絡(luò)難以保證用戶的數(shù)據(jù)安全,因此Apple才在iOS9上強推ATS,反向逼迫服務(wù)器升級HTTPS的配置,已提供更安全的網(wǎng)絡(luò)環(huán)境。建議開發(fā)者不要簡單地將ATS禁用,而應(yīng)該升級服務(wù)器的配置支持ATS,為用戶提供更安全的服務(wù)。

4. 調(diào)試SSL/TLS

開發(fā)一個新的App,通常終端和后端先協(xié)商好了具體業(yè)務(wù)邏輯的通信協(xié)議,后端和終端按照協(xié)議實現(xiàn)邏輯之后,就進入聯(lián)調(diào)階段,第一次聯(lián)調(diào)往往會回到很多問題,包括數(shù)據(jù)格式不對,缺少基礎(chǔ)字段等;假如是基于HTTPS的網(wǎng)絡(luò)請求,則很可能由于后臺配置問題,導(dǎo)致遇到如CFNetwork SSLHandshake failed (-9824)這類握手失敗的錯誤。面對這類SSL錯誤,該如何來解決呢?根據(jù)本人經(jīng)驗,主要是分兩步:

4.1 錯誤碼

這會不會太簡單了?其實最簡單的往往是最有效的。SSL相關(guān)錯誤碼可以在中找到。上面-9824的錯誤,對應(yīng)的是errSSLPeerHandshakeFail = -9824, /* handshake failure */,其他常見的錯誤碼還有:


  1. //... 
  2.     /* fatal errors detected by peer */ 
  3.     errSSLPeerUnexpectedMsg     = -9819,    /* unexpected message received */ 
  4.     errSSLPeerBadRecordMac      = -9820,    /* bad MAC */ 
  5.     errSSLPeerDecryptionFail    = -9821,    /* decryption failed */ 
  6.     errSSLPeerRecordOverflow    = -9822,    /* record overflow */ 
  7.     errSSLPeerDecompressFail    = -9823,    /* decompression failure */ 
  8.     errSSLPeerHandshakeFail     = -9824,    /* handshake failure */ 
  9.     errSSLPeerBadCert           = -9825,    /* misc. bad certificate */ 
  10.     errSSLPeerUnsupportedCert   = -9826,    /* bad unsupported cert format */ 
  11.     errSSLPeerCertRevoked       = -9827,    /* certificate revoked */ 
  12.     errSSLPeerCertExpired       = -9828,    /* certificate expired */ 
  13.     errSSLPeerCertUnknown       = -9829,    /* unknown certificate */ 
  14.     errSSLIllegalParam          = -9830,    /* illegal parameter */ 
  15.     errSSLPeerUnknownCA         = -9831,    /* unknown Cert Authority */ 
  16.     errSSLPeerAccessDenied      = -9832,    /* access denied */ 
  17.     /* more errors detected by us */ 
  18.     errSSLHostNameMismatch      = -9843,    /* peer host name mismatch */ 
  19.     errSSLConnectionRefused     = -9844,    /* peer dropped connection before responding */ 
  20.     errSSLDecryptionFail        = -9845,    /* decryption failure */ 
  21.     errSSLBadRecordMac          = -9846,    /* bad MAC */ 
  22.     errSSLRecordOverflow        = -9847,    /* record overflow */ 
  23.     errSSLBadConfiguration      = -9848,    /* configuration error */ 
  24.     //... 

但靠錯誤碼只能判斷大概的情況,很多時候并不能明確知道到底是什么原因?qū)е碌模宰钪庇^的,還是需要抓包分析。

4.2 抓包分析

在這一階段,使用Charles來抓包是沒有用的,因為Charles是作為HTTP代理工作的,它會抓取代理的網(wǎng)絡(luò)報文,然后將報文組合成HTTP/HTTPS協(xié)議包,對于HTTP調(diào)試非常方便,但由于細節(jié)的缺失,沒辦法使用它來分析SSL相關(guān)錯誤。所以我們需要使用上古神器Wireshark。

關(guān)于Wireshark就不再多介紹了,網(wǎng)上已經(jīng)有很多相關(guān)介紹和抓包教程,如《Mac OS X上使用Wireshark抓包》等,基本上可以很快上手。下面我們就以適配iOS9的ATS為例,來說下如何進行抓包分析,找出因為不支持ATS導(dǎo)致SSL握手失敗問題。

還記得SSL握手過程么?不記得可以重溫下這篇文章:圖解SSL/TLS協(xié)議。我們也來看看Wireshark上抓取到的包來直觀學(xué)習(xí)正常的SSL握手流程:

blob.png

上圖是一個標(biāo)準(zhǔn)的HTTPS請求抓取的包:

1) 在TCP三次握手成功之后,客戶端發(fā)起SSL的Client Hello(No.68幀),傳遞隨機數(shù)(Random),和客戶端支持的密碼套件(Cipher Suites)、壓縮方法、簽名算法等信息; 如下圖所示,這是Client Hello所攜帶的信息,可以展開來看相關(guān)的詳情:

blob.png

2) 服務(wù)器從Client Hello中匹配支持的密碼套件(Cipher Suites)、壓縮算法和簽名算法,和服務(wù)器新生成的一個隨機數(shù)返回給客戶端,這就是Server Hello(No.70幀)。 下圖就是對1)中Client Hello的回應(yīng),由圖可以看出,服務(wù)端匹配的Cipher Suite是TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:

blob.png

3) 服務(wù)器同時會將證書發(fā)給客戶端(No.73幀);

4) 客戶端確認(rèn)證書有效,則會生產(chǎn)最后一個隨機數(shù)(Premaster secret),并使用證書的公鑰RSA加密這個隨機數(shù),發(fā)回給服務(wù)端。為了更高的安全性,會改為Diffie-Hellman算法(簡稱DH算法);采用DH算法,最后一個隨機數(shù)(Premaster secret)是不需要傳遞的,客戶端和服務(wù)端交換參數(shù)之后就可以算出。Client Key Exchange(No. 75幀);

5) 接下來雙方都會發(fā)送Change Cipher Spec通知對方,接下來的所有消息都會使用簽名約定好的密鑰進行加密通信。

6) 最后是雙方的Finished Message(即Encrypted Handshake Message, No. 77、79幀),這個消息是最終的校驗,里面包含了握手過程中的Session Key等信息,如果對方能夠解密這個消息則表示握手成功,結(jié)束整個SSL Handshake流程。

相關(guān)SSL/TLS接口信息,請查看:rfc5246以及SSL/TLS in Detail.aspx)

上面已抓取的HTTPS請求為例,簡單介紹了SSL/TLS的握手流程。下面就列舉下調(diào)試適配ATS過程中遇到的主要問題:

1) 密碼套件(Cipher Suite)等參數(shù)無法匹配:密碼套件不匹配是最常見的握手失敗的例子。

在ATS中,可接受的密碼套件有包括:


  1. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 
  2. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 
  3. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 
  4. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 
  5. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 
  6. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 
  7. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 
  8. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 
  9. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 
  10. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 
  11. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 

但往往很多服務(wù)器的HTTPS配置很久沒有升級,沒辦法支持這些Cipher Suite;客戶端發(fā)送Client Hello給服務(wù)端,帶上支持密碼套件參數(shù);服務(wù)端查看這些參數(shù),發(fā)現(xiàn)一個都不支持,則直接返回Handshake Failure的信息。如下圖:

blob.png

一般在接受到客戶端發(fā)送的Client Hello后返回Handshake Failure,都是因為服務(wù)端無法匹配客戶端SSL握手參數(shù)。至于是不是密碼套件這個參數(shù)匹配的問題,建議抓取取消ATS了的正常HTTPS請求包進行對比,找出具體不匹配的參數(shù)。

2) SSL/TLS版本過低,這個也非常常見,但一般會被上一個參數(shù)不匹配的錯誤所掩蓋。因為大多數(shù)SSL/TLS版本低的服務(wù)器HTTPS配置支持的密碼套件等參數(shù)版本也比較低,而SSL/TLS版本是客戶端收到Server Hello之后才驗證的,但前面握手失敗就走不到這一步了。所以密碼套件(Cipher Suite)等參數(shù)無法匹配支持,一般也就意味著服務(wù)端SSL/TLS版本過低。

3) 證書鏈配置錯誤:在開發(fā)過程中,本人遇到過證書鏈沒有按照順序進行配置的問題,也遇到過只配置了葉子證書的問題。對于這些問題,可以直接查看SSL握手過程中,服務(wù)端返回的Certificate包:

blob.png

上圖可以看到證書鏈Certificates只有一個,這是典型的配置錯誤。

PS:使用Wireshark進行抓包的時候,有時候由于一些HTTPS請求的SSL/TLS版本號太低,Wireshark沒辦法辨認(rèn)其是SSL包,而是顯示為TCP;此時可以手動來Decode:選擇對應(yīng)的TCP數(shù)據(jù)幀,右鍵 -》Decode As -》Transport 選擇SSL -》Apply既可。

blob.png

責(zé)任編輯:倪明 來源: Jaminzzhang的博客
相關(guān)推薦

2015-08-10 10:04:28

2019-02-12 09:52:20

Linux安全Windows

2009-03-10 13:18:56

2019-12-11 10:16:15

數(shù)據(jù)安全隱私保護網(wǎng)絡(luò)安全

2017-01-16 16:16:59

漏洞uaf代碼

2010-09-27 11:39:14

互聯(lián)網(wǎng)安全網(wǎng)絡(luò)管理

2009-07-01 20:58:40

2014-11-10 16:06:26

加密APP安全打車軟件

2009-07-01 20:49:06

2016-10-24 22:05:22

2021-04-21 10:38:44

Spring Boot RememberMe安全

2017-04-25 09:04:16

2009-12-17 11:21:33

2021-07-07 12:36:10

HTTPSSSL通信

2023-07-04 06:59:25

2022-03-22 09:16:24

HTTPS數(shù)據(jù)安全網(wǎng)絡(luò)協(xié)議

2022-05-19 07:09:29

機制沙箱安全JVM

2016-09-27 22:45:47

2016-11-18 08:41:23

2022-07-07 10:41:53

鯤鵬
點贊
收藏

51CTO技術(shù)棧公眾號

国产乡下妇女做爰毛片| 日本男人操女人| 日本黄视频在线观看| 国产精品色网| 日韩在线视频国产| 日日夜夜精品视频免费观看| 欧美6一10sex性hd| 久久一区二区三区四区| 国产热re99久久6国产精品| 深夜福利影院在线观看| 婷婷激情久久| 欧美高清一级片在线| 欧美日韩福利在线| 成人影视在线播放| 国产成人av一区| 日本久久精品视频| 日韩欧美综合视频| 神马影视一区二区| 日韩一区二区三区视频| 日韩精品免费播放| 牛牛在线精品视频| 欧美激情综合五月色丁香小说| 成人综合色站| 中文字幕一区二区免费| 亚洲黄色天堂| 最好看的2019的中文字幕视频| 国产成人精品一区二区在线小狼 | www高清在线视频日韩欧美| 亚洲成a人无码| 成人亚洲视频| 欧美午夜激情视频| 成人国产在线看| 超碰国产在线| 91看片淫黄大片一级| 91久久久精品| 亚洲图片欧美日韩| 亚洲国产一区二区精品专区| 日韩视频免费大全中文字幕| 国产一二三四五区| 久久丝袜视频| 日韩免费一区二区三区在线播放| 日韩av片网站| 都市激情亚洲综合| 欧美午夜www高清视频| 国产又粗又大又爽的视频| 国产精品ⅴa有声小说| 97se亚洲国产综合自在线| 99国精产品一二二线| 一级做a爱片性色毛片| 久久亚洲美女| 国产91对白在线播放| 不卡的免费av| 欧美午夜视频| 欧美黄色性视频| 天天天天天天天天操| 91偷拍一区二区三区精品| 亚洲深夜福利网站| 在线精品一区二区三区| 豆花视频一区二区| 亚洲成av人乱码色午夜| 国产乱淫av麻豆国产免费| 老司机亚洲精品一区二区| 制服丝袜激情欧洲亚洲| 亚洲精品成人在线播放| 日韩有码欧美| 91精品国产综合久久久久久久| 免费看涩涩视频| 成人在线免费av| 欧美日韩aaaaaa| www.久久av.com| av成人在线网站| 欧美一卡在线观看| 欧美日韩一区二区区| 无人区乱码一区二区三区| 日韩无一区二区| 无码成人精品区在线观看| 美女网站色精品尤物极品姐弟| 亚洲第一精品电影| 国产激情视频网站| 亚洲理论电影片| 亚洲一级片在线看| 男人天堂资源网| 亚洲澳门在线| 久久久久久久一区二区三区| 日本熟妇色xxxxx日本免费看| 99香蕉国产精品偷在线观看 | 欧美精品色哟哟| 亚洲人人精品| 日韩免费在线观看视频| 91精东传媒理伦片在线观看| 国产精品白丝jk白祙喷水网站| 成人av免费电影| 视频二区在线| 国产精品免费人成网站| 国产精品久久成人免费观看| 国产丝袜视频在线播放| 日韩欧美国产黄色| 97人人爽人人| 日韩三级视频| 北条麻妃在线一区二区| 久久精品国产亚洲AV无码男同| 欧美中文日韩| 亚洲综合中文字幕在线观看| 无码国产伦一区二区三区视频| 国产欧美精品国产国产专区| 成人午夜免费剧场| 不卡av播放| 在线电影一区二区三区| 国产中文字幕一区二区| 亚洲不卡av不卡一区二区| 68精品久久久久久欧美 | 欧美一区二区二区| 精品一区二区三区自拍图片区 | 日本电影亚洲天堂| 在线观看国产黄| 国产成人精品一区二区三区四区| 裸体丰满少妇做受久久99精品| √天堂资源地址在线官网| 亚洲一区在线观看视频| 亚洲成人福利在线| 欧美jizz19性欧美| 欧美精品日韩三级| 亚洲中文无码av在线| 成人晚上爱看视频| 亚洲一区二区三区四区中文| www.综合| 日韩午夜在线播放| 国精品人伦一区二区三区蜜桃| 一区二区三区四区五区在线 | 亚洲欧美影音先锋| 久久久精品在线视频| 超碰97久久| 久久久精品亚洲| 亚洲 小说区 图片区| 不卡视频免费播放| 韩国无码av片在线观看网站| 91精品国产66| 精品网站999www| 久久午夜无码鲁丝片| 精品一区在线看| 日韩久久久久久久| 范冰冰一级做a爰片久久毛片| 精品久久人人做人人爽| 色偷偷www8888| 免费在线看一区| 久久综合九色综合网站| 91色在线看| 精品久久一区二区三区| 久久99久久98精品免观看软件| 国产一区三区三区| 特级毛片在线免费观看| 欧美xxxx网站| yellow中文字幕久久| 一二三四区在线| 国产精品色噜噜| 国内外成人免费在线视频| 成人网18免费网站| 国产精品免费在线免费| 国产中文字幕在线看| 在线观看国产日韩| 69视频在线观看免费| 免费在线观看一区二区三区| 亚洲午夜在线观看| 亚洲三级在线| 九九久久国产精品| 亚洲欧美另类一区| 图片区小说区区亚洲影院| 亚洲天堂成人av| 三级影片在线观看欧美日韩一区二区| 欧美乱偷一区二区三区在线| 一呦二呦三呦精品国产| 综合久久五月天| aaa一区二区| 亚洲国产aⅴ天堂久久| 五月婷婷综合在线观看| 日韩不卡免费视频| 亚洲欧美久久234| 日韩精品一区二区三区中文字幕| 欧美丰满少妇xxxxx| 国精产品一品二品国精品69xx | 欧美亚洲另类在线一区二区三区| 欧美性xxx| 中文字幕av日韩| 国产精品久久777777换脸| 亚洲丝袜精品丝袜在线| 天天色综合社区| 欧美91视频| 国产精品18毛片一区二区| 操人在线观看| 亚洲天堂av高清| 国产日韩欧美视频在线观看| 一区二区三区中文字幕在线观看| 大桥未久恸哭の女教师| 国产欧美不卡| 亚洲精品在线免费| 欧美大片91| 2018日韩中文字幕| www.av在线播放| 欧美丝袜丝nylons| 国产精品成人久久| 久久这里只有精品视频网| 日av中文字幕| 久久久国产精品| 久久久久资源| 亚洲影视资源| 性亚洲最疯狂xxxx高清| 国产在线视频网址| 精品精品国产高清一毛片一天堂| 免费视频久久久| 综合激情成人伊人| 白嫩情侣偷拍呻吟刺激| 玖玖国产精品视频| 久久人人爽人人爽人人av| 久久av网址| 99re6热在线精品视频播放速度| 好看的中文字幕在线播放| 亚洲人高潮女人毛茸茸| 国产露脸国语对白在线| 污片在线观看一区二区| 一起操在线播放| 久久午夜电影网| 欧美熟妇精品一区二区| 久久综合伊人| 久久www视频| 日韩电影免费在线观看| 久久99精品国产99久久| 亚洲毛片在线免费| 欧美亚洲成人网| 91小视频xxxx网站在线| 日韩在线视频导航| 免费在线黄色电影| 亚洲国内精品在线| wwwav在线播放| 欧美在线影院一区二区| 日韩精品视频免费播放| 亚洲狼人国产精品| 亚洲女人久久久| 日本一二三不卡| 国产jjizz一区二区三区视频| 成人精品国产免费网站| 一级做a爱视频| 久久国产日韩欧美精品| 久久久久久久少妇| av成人黄色| 日韩精品综合在线| 午夜久久黄色| 水蜜桃一区二区三区| 亚洲国产最新| 国产精品五区| 免费av手机在线观看| 91精品国产成人观看| 日韩尤物视频| 欧美一区2区| 欧美性xxxx69| 亚洲制服一区| 久久久av水蜜桃| 一本久久青青| 久久精品99| 窝窝社区一区二区| 欧美亚洲爱爱另类综合| 亚洲aaa级| 日韩高清国产精品| 欧美久久精品一级c片| 日本午夜一区二区三区| 久久免费大视频| 午夜一区二区三视频在线观看| 国产成人精品一区二区免费看京 | 欧美激情一级精品国产| 蜜乳av一区| 国模私拍视频一区| av中文字幕在线看| 九九热最新视频//这里只有精品 | 给我免费播放片在线观看| 欧美视频四区| 97中文字幕在线| 国产精品三上| av免费网站观看| 蜜桃视频在线一区| 在线观看亚洲色图| 国产一区二区精品久久99| 三上悠亚 电影| 成人在线一区二区三区| 欧美一区二区三区免费观看视频| 日韩精品久久久久久久| 午夜一区二区三区在线观看| 国产嫩bbwbbw高潮| 在线亚洲欧美专区二区| 6—12呦国产精品| 精品99久久久久久| 香蕉久久国产av一区二区| 亚洲另类xxxx| 乱人伦中文视频在线| 久久免费视频在线观看| 在线免费av资源| 国产精品久久久久久久久久免费| 电影久久久久久| 91蜜桃网站免费观看| 青青久久av| 亚洲精品国产精品国自产| 欧美精品一线| 50路60路老熟妇啪啪| 久久精品国产第一区二区三区| 午夜啪啪小视频| 91一区二区在线观看| 一级片黄色录像| 亚洲福利一区二区| 少妇无套内谢久久久久| 日韩欧美国产不卡| 美女做暖暖视频免费在线观看全部网址91 | 国产传媒欧美日韩成人| www.88av| 国产精品不卡在线| 国产在线精品观看| 正在播放亚洲一区| 国产精品国产高清国产| 精品久久久91| 亚洲综合在线电影| 999国内精品视频在线| 欧美猛男做受videos| 免费看日b视频| 久久99久久久欧美国产| 偷偷色噜狠狠狠狠的777米奇| 国产精品久久久久精k8 | 在线视频亚洲一区| 国产伦理吴梦梦伦理| 精品亚洲男同gayvideo网站| 少妇av在线| 国产九九精品视频| 欧美美女在线直播| 欧美一级免费播放| 精品在线观看视频| 无码人妻精品一区二区中文| 精品久久久久久久久久| 国产黄色小视频在线观看| 一本大道久久加勒比香蕉| а√天堂8资源在线官网| 国产精品综合不卡av| 精品在线手机视频| 久久久久99精品成人片| 国产91精品一区二区麻豆网站| 亚洲色图 激情小说| 欧美三级免费观看| 熟妇人妻一区二区三区四区| 欧美成人小视频| 亚洲伦理网站| 日本不卡在线观看| 久久国产日本精品| 日本丰满少妇裸体自慰| 亚洲高清视频的网址| 国产 欧美 自拍| 欧美国产在线电影| 日韩视频1区| 国产精品一线二线三线| 国产成人精品一区二| 久久成人小视频| 欧美一区二区三区系列电影| 免费在线看黄网站| 国产一区二区色| 天天射成人网| 欧美丝袜在线观看| 中文字幕一区av| 国产男女无套免费网站| 最近2019年日本中文免费字幕| 国产综合av| 亚洲精品一区二区三| 捆绑调教美女网站视频一区| 精品国产国产综合精品| 91精品国产手机| av免费在线免费观看| 国产日韩欧美精品| 激情欧美日韩一区| 亚洲天堂av网站| 五月婷婷综合网| 天堂资源中文在线| 国产成人极品视频| 中文精品一区二区| 欧美婷婷精品激情| 日韩理论片在线| 色综合久久久久久| 欧日韩在线观看| 国内成人精品| av中文字幕网址| 亚洲自拍偷拍综合| 色wwwwww| 18久久久久久| 国产精品97| 中国特级黄色大片| 欧美视频完全免费看| 成人a在线视频免费观看| 成人羞羞视频免费| 视频一区视频二区在线观看| 人人干在线观看| 欧美哺乳videos| 日本综合视频| 青青视频免费在线| 国产99久久久国产精品潘金网站| 亚洲精品男人的天堂| 久久精品电影网站| 亚洲成人a级片| 成熟丰满熟妇高潮xxxxx视频|