ios 阿里云的服務(wù)器在AFN框架下配置https,以及解決ipv6被拒的問題

一、為了網(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í)候使用,花不了多少錢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容