前言
根據(jù)蘋果要求,2017必須要適配https。服務(wù)器端配置https需要一堆東西,這里就不詳述了,主要介紹客戶端的問題,而且是最簡(jiǎn)單的配置方式。
有的沒有配置證書只是簡(jiǎn)單設(shè)置了網(wǎng)絡(luò)請(qǐng)求的security也成功了,這里介紹的方式是配置證書的,更安全更有保障度。
這里先介紹AFNetworking的基本配置以及相關(guān)證書。
一、配置證書
1、服務(wù)器端證書配置好后可以給客戶端一個(gè)證書,后綴是.crt的,拿到手后轉(zhuǎn)成.der或.cer格式
-
.crt轉(zhuǎn).der方法 >
openssl x509 -in Users/Jeffrey/ca.crt -out /Users/Jeffrey/ca.der -outform DER
-
.crt轉(zhuǎn).cer方法
openssl x509 -in /Users/Jeffrey/ca.crt -out /Users/Jeffrey/ca.cer -outform DER
這個(gè)方法沒有測(cè)試成功,因?yàn)槲覀兒笈_(tái)人員沒有給我有效的證書。這個(gè)方法如果報(bào)錯(cuò)的話需要做相關(guān)驗(yàn)證。參考:https雙向認(rèn)證iOS客戶端處理
2、直接終端生成對(duì)應(yīng)的cer證書
這個(gè)方式會(huì)跳過服務(wù)器端給的證書一步,因?yàn)楹芏鄷r(shí)候你們都不清楚到底要哪個(gè)證書,也不知道哪里會(huì)出現(xiàn)錯(cuò)誤。
直接看命令:
openssl s_client -connect www.baidu.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer
百度的域名換成自己公司的,注意不要加http或https。如果貴公司的域名的https還沒有配置好,那么這步也會(huì)是無效的,會(huì)報(bào)錯(cuò)。
Expecting: TRUSTED CERTIFICATE
這個(gè)方法親測(cè)有效!
二、證書導(dǎo)入
直接拖進(jìn)去,記住這步。否則會(huì)沒有讀取到證書文件。

三、AFNetworking單向驗(yàn)證設(shè)置
由于網(wǎng)絡(luò)庫沒有更新,所以這里使用的還是AFNetworking 2.6.0的相關(guān)配置,其實(shí)最近的也是一致的,配置的都是AFSecurityPolicy,是一致的。
+ (AFSecurityPolicy*)customSecurityPolicy
{
// 先導(dǎo)入證書 -- 這里要判斷環(huán)境
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server_staging" ofType:@"cer"];//證書的路徑
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用證書驗(yàn)證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO
// 如果是需要驗(yàn)證自建證書,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
//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 = NO;
if (!certData) {
return securityPolicy;
}
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
這里建議統(tǒng)一設(shè)置,否則每次請(qǐng)求再單獨(dú)添加會(huì)比較繁瑣。
_requestManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[KYConfig defaultConfig].serverHostURL];
NSMutableSet *contentTypes = [_requestManager.responseSerializer.acceptableContentTypes mutableCopy];
[contentTypes addObject:@"application/json"];
_requestManager.responseSerializer.acceptableContentTypes = [contentTypes copy];
_requestManager.securityPolicy = [KYHTTPManager customSecurityPolicy];
關(guān)于webView以及SDWebImage等后續(xù)篇章會(huì)繼續(xù)介紹,敬請(qǐng)關(guān)注。
下一篇:
相關(guān)參考:
https雙向認(rèn)證iOS客戶端處理
iOS 遷移到HTTPS(自建證書+單向驗(yàn)證+AF3.0+WKWebView+SDWebImage)
如果需要Demo請(qǐng)留言,會(huì)在后續(xù)版本中添加。