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之間)。html
2.HTTPS和HTTP的區別主要爲如下四點:
1、https協議須要到ca申請證書,通常免費證書不多,須要交費。
2、http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議。
3、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
4、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。算法
3.簡單說明
1)HTTPS的主要思想是在不安全的網絡上建立一安全信道,並可在使用適當的加密包和服務器證書可被驗證且可被信任時,對竊聽和中間人攻擊提供合理的保護。
2)HTTPS的信任繼承基於預先安裝在瀏覽器中的證書頒發機構(如VeriSign、Microsoft等)(意即「我信任證書頒發機構告訴我應該信任的」)。
3)所以,一個到某網站的HTTPS鏈接可被信任,若是服務器搭建本身的https 也就是說採用自認證的方式來創建https信道,這樣通常在客戶端是不被信任的。
4)因此咱們通常在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續。瀏覽器
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); } }
/* ATS默認的條件 1)服務器TLS版本至少是1.2版本 2)鏈接加密只容許幾種先進的加密 3)證書必須使用SHA256或者更好的哈希算法進行簽名,要麼是2048位或者更長的RSA密鑰,要麼就是256位或更長的ECC密鑰。 */
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服務器