眾所周知,蘋果有言,從2017年開始服协,將屏蔽http的資源,強(qiáng)推https啦粹。
1 HTTPS以及SSL/TSL概念
SSL(Secure Sockets Layer, 安全套接字層)偿荷,因?yàn)樵然ヂ?lián)網(wǎng)上使用的HTTP協(xié)議是明文的,存在很多缺點(diǎn)唠椭,比如傳輸內(nèi)容會(huì)被偷窺和篡改跳纳。SSL協(xié)議的作用就是在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。
到了1999年贪嫂,SSL 因?yàn)閼?yīng)用廣泛寺庄,已經(jīng)成為互聯(lián)網(wǎng)上的事實(shí)標(biāo)準(zhǔn)。IETF就在那年把SSL標(biāo)準(zhǔn)化力崇。標(biāo)準(zhǔn)化之后的名稱改為 TLS(Transport Layer Security斗塘,傳輸層安全協(xié)議)。SSL與TLS可以視作同一個(gè)東西的不同階段餐曹。
簡(jiǎn)單來說逛拱,HTTPS = HTTP + SSL/TLS, 也就是HTTP over SSL或HTTP over TLS,這是后面加S的由來。
HTTPS和HTTP異同:HTTP和HTTPS使用的是完全不同的連接方式台猴,用的端口也不一樣朽合,前者是80,后者是443饱狂。HTTP的連接很簡(jiǎn)單曹步,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸休讳、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議讲婚,比HTTP協(xié)議安全。
2 證書準(zhǔn)備
- 證書轉(zhuǎn)換
在服務(wù)器人員俊柔,給你發(fā)送的crt證書后筹麸,進(jìn)到證書路徑活合,執(zhí)行下面語(yǔ)句。這樣你就可以得到cer類型的證書了物赶。雙擊白指,導(dǎo)入電腦。
// openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der
- 證書放入工程
- 可以直接把轉(zhuǎn)換好的cer文件拖動(dòng)到工程中酵紫。
- 可以在鑰匙串內(nèi)告嘲,找到你導(dǎo)入的證書,單擊右鍵奖地,導(dǎo)出項(xiàng)目橄唬,就可以導(dǎo)出.cer文件的證書了
3 代碼準(zhǔn)備
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3 AFNetWorking 3.x版本支持HTTPS
- 支持https(校驗(yàn)證書,不可以抓包):
// 1.初始化
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
// 2.設(shè)置證書模式
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
// 客戶端是否信任非法證書
mgr.securityPolicy.allowInvalidCertificates = YES;
// 是否在證書域字段中驗(yàn)證域名
[mgr.securityPolicy setValidatesDomainName:NO];
- 支持https(不校驗(yàn)證書参歹,可以抓包查看):
// 1.初始化
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.設(shè)置非校驗(yàn)證書模式
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager.securityPolicy setValidatesDomainName:NO];