一、為了網(wǎng)絡(luò)安全,使用https請(qǐng)求,ios端需要做一些配置。我們用的是阿里云的免費(fèi)的服務(wù)器。
1.去后臺(tái)要阿里云服務(wù)器的證書,證書在阿里云的網(wǎng)站上下載,里面有很多證書,有些是服務(wù)器支持https的證書,我們ios端只要一個(gè)就OK了,在other文件夾里有三個(gè).pem的證書分別為如圖

我們要這個(gè)chain的就可以了,證書打開有G1,就對(duì)了。如果服務(wù)器后臺(tái)人員給我們的是.cer的后綴,我們就直接導(dǎo)入項(xiàng)目,如果是pem格式的,需要我們?cè)诮K端轉(zhuǎn)。
2.終端轉(zhuǎn)cer命令,將pem轉(zhuǎn)成cer的。
終端輸入: ??
openssl x509 -in /Users/meirongcheng/Desktop/chain.pem-out /Users/meirongcheng/Desktop/chain.cer -outform der
一行命令轉(zhuǎn)成。如圖:

會(huì)生成.cer的證書拖入項(xiàng)目即可

3.適配AFN,3.0以上版本支持了https,設(shè)置下即可,在AFHTTPSessionManager子類的網(wǎng)絡(luò)工具類中做配置,代碼如下
+ (instancetype)sharedZFClient {
static AFAppDotNetAPIClient *_sharedZFClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedZFClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:SERVERHTTPS_URL_ZF]];
if (Http) {
//http
_sharedZFClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
//
}else{
//https
[_sharedZFClient setSecurityPolicy:[self customSecurityPolicy]];
}
[_sharedZFClient.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
//加載30秒沒結(jié)果為失敗
_sharedZFClient.requestSerializer.timeoutInterval = 30;
//告訴AFN,下載下來的數(shù)據(jù)是JSON,直接解析返回給我們
_sharedZFClient.responseSerializer = [AFJSONResponseSerializer serializer];
_sharedZFClient.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/xml",@"text/plain", nil];
});
return _sharedZFClient;
}
+ (AFSecurityPolicy *)customSecurityPolicy {
// 先導(dǎo)入證書 證書由服務(wù)端生成,具體由服務(wù)端人員操作
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"chain" ofType:@"cer"];//證書的路徑
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用證書驗(yàn)證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO
// 如果是需要驗(yàn)證自建證書,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = NO;
//validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES;
//假如證書的域名與你請(qǐng)求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書,也可以建立連接,這個(gè)非常危險(xiǎn),建議打開。
//置為NO,主要用于這種情況:客戶端請(qǐng)求的是子域名,而證書上的是另外一個(gè)域名。因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊(cè)的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的;當(dāng)然,有錢可以注冊(cè)通配符的域名*.google.com,但這個(gè)還是比較貴的。
//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯。
securityPolicy.validatesDomainName = YES;
securityPolicy.pinnedCertificates =? [[NSSet alloc]initWithObjects:cerData, nil];
return securityPolicy;
}
4.afn請(qǐng)求有了證書驗(yàn)證后,在info.plist中設(shè)置yes,默認(rèn)是NO,意思是是否允許任意加載。
yes是http也可以訪問,no是只能訪問https,原因是如果設(shè)置為no,有些h5的頁面是http的,將無法訪問。設(shè)置為yes并不影響安全,抓包一樣抓不到。

二、關(guān)于ipv6被拒的問題,首先使用最新的afn,支持ipv6,如果有網(wǎng)絡(luò)監(jiān)控,使用afn自帶的就好,用其他的要支持ipv6,使用getip的三方的要支持ipv6,自己搭建ipv6環(huán)境,測(cè)試一下,參考 http://m.itdecent.cn/p/632d995749e1
測(cè)試有問題,就要排查有關(guān)網(wǎng)絡(luò)的東西是否支持了ipv6,AFN3.0以后,sdweb新的也是支持ipv6的不用做特別設(shè)置。如果測(cè)試沒問題,還是被拒了,讓領(lǐng)導(dǎo)購(gòu)買海外代理服務(wù)器,在審核的時(shí)候使用,花不了多少錢。