聽說??在2017年1月1日將強(qiáng)制使用https不知真假席镀??夏漱?不管怎樣先用用吧豪诲。如果你的后臺(tái)開始用https了,前端該做些啥呢挂绰?廢話不多少屎篱,直接來干貨!?佟交播!待會(huì)再來詳細(xì)解說為什么。
首先要搞清楚你們后臺(tái)使用的是什么證書践付?是自建的證書還是CA機(jī)構(gòu)頒發(fā)的證書秦士。
CA證書
1.升級(jí)AFNetworking到3.0(怎么升級(jí)?不要問我)
2.在你使用AFNetworking中
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
progress:(void (^)(NSProgress * _Nonnull))uploadProgress
success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
這個(gè)方法之前添加兩句代碼
//AFHTTPSessionManager *manager;
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:
AFSSLPinningModeNone];//AFSSLPinningModeNone, 是默認(rèn)的認(rèn)證方式永高,只會(huì)在系統(tǒng)的信任的證書列表中對(duì)服務(wù)端返回的證書進(jìn)行驗(yàn)證
manager.securityPolicy = policy;
3.這樣理論上是可以進(jìn)行https請(qǐng)求了
自建證書
如果是自建證書隧土,那么需要后端提供一個(gè)ssl證書,需要一個(gè) .crt 文件
1.然后前端可以使用openssl 進(jìn)行轉(zhuǎn)換:這樣你就可以得到一個(gè).cer文件命爬,把這個(gè)文件加到工程里
1.打開終端
2.輸入 openssl x509 -in 證書名.crt -out 證書名.cer -outform der
2.開始寫代碼曹傀,先寫個(gè)方法
- (AFSecurityPolicy*)customSecurityPolicy
{
//先導(dǎo)入證書
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"證書名" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:
AFSSLPinningModeCertificate];//AFSSLPinningModeCertificate 需要客戶端預(yù)先保存服務(wù)端的證書(自建證書)
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO
// 如果是需要驗(yàn)證自建證書遇骑,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
然后把之前添加的兩句代碼變成這一句
manager.securityPolicy = [self customSecurityPolicy];
原理
最好先了解下HTTP和HTTPS卖毁,可以參考:http://www.techug.com/https-ssl-tls
然后再了解下數(shù)字證書和CA:http://kb.cnblogs.com/page/194742/
簡(jiǎn)單來說https就是在http外面加了一層保護(hù)膜,發(fā)起請(qǐng)求后服務(wù)端會(huì)先返回一個(gè)證書落萎,客戶端接收到并驗(yàn)證,然后加密傳輸炭剪。
NSURLSession主要通過代理方法
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler
而AFNetworking的AFSecurityPolicy類就是封裝了這個(gè)功能练链,所以在使用AFNetworking時(shí)只要加上AFSecurityPolicy就可以完成驗(yàn)證。