目錄
1. HTTPS簡(jiǎn)介
2. iOS添加HTTPS支持
1. HTTPS簡(jiǎn)介
簡(jiǎn)而言之弹灭,HTTPS = HTTP + SSL(Secure Socket Layer 安全套接字)
HTTPS原理如上圖所示:
- 1.服務(wù)器存在一個(gè)受保護(hù)空間保存著安全證書(shū)榄檬,當(dāng)客戶端第一次向服務(wù)器發(fā)送一個(gè)HTTPS請(qǐng)求時(shí),服務(wù)器首先返回安全證書(shū),客戶端可以選擇是否安裝該安全證書(shū)嫩与。
- 2.客戶端安裝安全證書(shū)后涕刚,該證書(shū)會(huì)利用證書(shū)中的公鑰對(duì)HTTPS請(qǐng)求進(jìn)行加密。加密后的數(shù)據(jù)簇捍,必須用保存在服務(wù)器的私鑰才能解密只壳,這樣即使黑客攔截了請(qǐng)求數(shù)據(jù),也無(wú)法對(duì)數(shù)據(jù)進(jìn)行解密暑塑,保證了數(shù)據(jù)安全吼句。
- 3.大型網(wǎng)站會(huì)強(qiáng)制安裝安全證書(shū),如:蘋果官網(wǎng)事格,Github
2. iOS添加HTTPS支持
- 設(shè)置NSURLSession代理惕艳,遵守NSURLSessionTaskDelegate協(xié)議。
- 建立請(qǐng)求任務(wù)
- (void)viewDidLoad
{
[super viewDidLoad];
// 設(shè)置session代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
// 建立請(qǐng)求任務(wù)
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];
}
- 實(shí)現(xiàn)協(xié)議方法:
/**
* challenge : 質(zhì)詢驹愚,保存服務(wù)器返回的是受保護(hù)空間protectionSpace
* completionHandler : 通過(guò)這個(gè)block远搪,來(lái)告訴URLSession要不要接受這個(gè)證書(shū)。
* completionHandler 要傳兩個(gè)參數(shù):NSURLSessionAuthChallengeDisposition逢捺、NSURLCredential
* NSURLSessionAuthChallengeDisposition 是枚舉類型谁鳍,用于決定如何處理安全證書(shū)
* NSURLCredential 是安全證書(shū)對(duì)象
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler
{
// 如果不是服務(wù)器信任類型的證書(shū),直接返回
if (![challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) return;
// 根據(jù)服務(wù)器的信任信息創(chuàng)建證書(shū)對(duì)象
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
// 利用completionHandler block使用這個(gè)證書(shū)
if (completionHandler)
{
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
}
- 使用AFNNetworking等框架,默認(rèn)支持HTTPS倘潜,不需要額外處理