iOS之HTTP和HTTPS的基本知識和應用

HTTPS的基本使用

  • 1.https簡單說明
    HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。
    即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。
    https: URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。

  • 2.HTTPS和HTTP的區別主要爲以下四點:
    一、https協議需要到ca申請證書,一般免費證書很少,需要交費。
    二、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
    三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
    四、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

  • 3.簡單說明
    1)HTTPS的主要思想是在不安全的網絡上創建一安全信道,並可在使用適當的加密包和服務器證書可被驗證且可被信任時,對竊聽和中間人攻擊提供合理的保護。
    2)HTTPS的信任繼承基於預先安裝在瀏覽器中的證書頒發機構(如VeriSign、Microsoft等)(意即“我信任證書頒發機構告訴我應該信任的”)。
    3)因此,一個到某網站的HTTPS連接可被信任,如果服務器搭建自己的https 也就是說採用自認證的方式來建立https信道,這樣一般在客戶端是不被信任的。
    4)所以我們一般在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續。

  • 4.對開發的影響。
  • 4.1 如果是自己使用NSURLSession來封裝網絡請求,涉及代碼如下。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSURLSessionDataTask *task =  [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    [task resume];
}
/*
 只要請求的地址是HTTPS的, 就會調用這個代理方法
 我們需要在該方法中告訴系統, 是否信任服務器返回的證書
 Challenge: 挑戰 質問 (包含了受保護的區域)
 protectionSpace : 受保護區域
 NSURLAuthenticationMethodServerTrust : 證書的類型是 服務器信任
 */
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
    //    NSLog(@"didReceiveChallenge %@", challenge.protectionSpace);
    NSLog(@"調用了最外層");
    // 1.判斷服務器返回的證書類型, 是否是服務器信任
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        NSLog(@"調用了裏面這一層是服務器信任的證書");
        /*
         NSURLSessionAuthChallengeUseCredential = 0,                     使用證書
         NSURLSessionAuthChallengePerformDefaultHandling = 1,            忽略證書(默認的處理方式)
         NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,     忽略書證, 並取消這次請求
         NSURLSessionAuthChallengeRejectProtectionSpace = 3,            拒絕當前這一次, 下一次再詢問
         */
//        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

        NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
        completionHandler(NSURLSessionAuthChallengeUseCredential , card);
    }
}

  

  • 5.ATS
    1)iOS9中新增App Transport Security(簡稱ATS)特性, 讓原來請求時候用到的HTTP,全部都轉向TLS1.2協議進行傳輸。
    2)這意味着所有的HTTP協議都強制使用了HTTPS協議進行傳輸。
    3)如果我們在iOS9下直接進行HTTP請求是會報錯。系統會告訴我們不能直接使用HTTP進行請求,需要在Info.plist中控制ATS的配置。
    "NSAppTransportSecurity"是ATS配置的根節點,配置了節點表示告訴系統要走自定義的ATS設置。
    "NSAllowsAritraryLoads"節點控制是否禁用ATS特性,設置YES就是禁用ATS功能。
    4)有兩種解決方法,一種是修改配置信息繼續使用以前的設置。
    另一種解決方法是所有的請求都基於基於"TLS 1.2"版本協議。(該方法需要嚴格遵守官方的規定,如選用的加密算法、證書等)
/*
 ATS默認的條件
 1)服務器TLS版本至少是1.2版本
 2)連接加密只允許幾種先進的加密
 3)證書必須使用SHA256或者更好的哈希算法進行簽名,要麼是2048位或者更長的RSA密鑰,要麼就是256位或更長的ECC密鑰。
 */

AFSecurityPolicy,內部有三個重要的屬性,如下:

AFSSLPinningMode SSLPinningMode;    //該屬性標明瞭AFSecurityPolicy是以何種方式來驗證
BOOL allowInvalidCertificates;      //是否允許不信任的證書通過驗證,默認爲NO
BOOL validatesDomainName;           //是否驗證主機名,默認爲YES

"AFSSLPinningMode"枚舉類型有三個值,分別是AFSSLPinningModeNone、AFSSLPinningModePublicKey、AFSSLPinningModeCertificate。

"AFSSLPinningModeNone"代表了AFSecurityPolicy不做更嚴格的驗證,"只要是系統信任的證書"就可以通過驗證,不過,它受到allowInvalidCertificates和validatesDomainName的影響;

"AFSSLPinningModePublicKey"是通過"比較證書當中公鑰(PublicKey)部分"來進行驗證,通過SecTrustCopyPublicKey方法獲取本地證書和服務器證書,然後進行比較,如果有一個相同,則通過驗證,此方式主要適用於自建證書搭建的HTTPS服務器和需要較高安全要求的驗證;

"AFSSLPinningModeCertificate"則是直接將本地的證書設置爲信任的根證書,然後來進行判斷,並且比較本地證書的內容和服務器證書內容是否相同,來進行二次判斷,此方式適用於較高安全要求的驗證。

如果HTTPS服務器滿足ATS默認的條件,而且SSL證書是通過權威的CA機構認證過的,那麼什麼都不用做。如果上面的條件中有任何一個不成立,那麼都只能修改ATS配置。

 收藏學習,轉自:http://www.cnblogs.com/chenjianjian/p/5422058.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章