iOS https單向配置

 

 

免責聲明:本文內容來自互聯網,用途僅爲我的總結參考,若有雷同你來打我啊?html

又到了喜聞樂見的寫博客時間了,今天的主角是喧囂已久的https,知其然要知其因此然,因此先捋一下他究竟是什麼json

1,什麼是SSL/TLS?跟HTTP和HTTPS有什麼關係?安全

2,之前的HTTP不是也能用嗎?爲何要用SSL/TLS,閒得慌?!Apple是否是又在反人類?服務器

3,如何適配?---弱弱地問下:加班要多久?session

//------------------app

答案:ui

1,HTTP+SSL/TLS+TCP = HTTPS (TLS 是 SSL 新的別稱)加密

打個比方:若是原來的 HTTP 是塑料水管,容易被戳破;那麼現在新設計的 HTTPS 就像是在原有的塑料水管以外,再包一層金屬水管。一來,原有的塑料水管照樣運行;二來,用金屬加固了以後,不容易被戳破。spa

這裏用兩張圖來介紹二者的區別:.net

    • HTTP:當客戶端發送請求,那麼服務器會直接返回數據。
  • HTTPS:當客戶端第一次發送請求的時候,服務器會返回一個包含公鑰的受保護空間(也成爲證書),當咱們發送請求的時候,公鑰會將請求加密再發送給服務器,服務器接到請求以後,用自帶的私鑰進行解密,若是正確再返回數據。這就是 HTTPS 的安全性所在。

2不使用SSL/TLS的HTTP通訊,就是不加密的通訊!

全部信息明文傳播,帶來了三大風險:

  1. 竊聽風險(eavesdropping):第三方能夠獲知通訊內容。

  2. 篡改風險(tampering):第三方能夠修改通訊內容。

  3. 冒充風險(pretending):第三方能夠冒充他人身份參與通訊。

  SSL/TLS協議是爲了解決這三大風險而設計的,但願達到:

  1. 全部信息都是加密傳播,第三方沒法竊聽。

  2. 具備校驗機制,一旦被篡改,通訊雙方會馬上發現。

  3. 配備身份證書,防止身份被冒充

3,由於每次通信都用到公鑰和密鑰,因此證書是必不可少的,通常證書由後臺分派給iOS和Android,後臺的證書能夠自簽名方法:https://www.oschina.net/question/2308078_230138),也能夠去各大認證機構購買

(1),當後臺派發證書給你的時候,到手的證書多是.crt格式的,這個時候須要把.crt格式的證書轉換成.cer(操做方法:進到證書路徑,執行下面語句 
// openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der 
這樣你就能夠獲得cer類型的證書了。雙擊,導入電腦。

(2),直接把轉換好的cer文件拖動到工程中

(3),infoplist加入如下:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>

(4),設置afnetWorking的manager的配置屬性便可正常請求:

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",

                                                         @"text/html",

                                                         @"image/jpeg",

                                                         @"image/png",

                                                         @"application/octet-stream",

                                                         @"text/json",

                                                         nil];

// 設置添加的代碼

    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"你拉到工程的cer證書的名稱" ofType:@"cer"];

    NSData * cerData = [NSData dataWithContentsOfFile:cerPath];

    mgr.securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];

    // 客戶端是否信任非法證書

    mgr.securityPolicy.allowInvalidCertificates = YES;

    // 是否在證書域字段中驗證域名

    [mgr.securityPolicy setValidatesDomainName:NO];

-----------------------附上不用afn的童鞋的福利,原生OC代碼配置:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler { // 判斷是不是信任服務器證書 if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) { // 告訴服務器,客戶端信任證書 // 建立憑據對象 NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; // 經過completionHandler告訴服務器信任證書 completionHandler(NSURLSessionAuthChallengeUseCredential,credntial); } NSLog(@"protectionSpace = %@",challenge.protectionSpace); }

相關文章
相關標籤/搜索