蘋果公司在iOS9以后開啟了HTTPS請求,并且在2017年開始強(qiáng)制HTTPS,我們也可以利用白名單來設(shè)置部分域名http請求,下面根據(jù)兩種情況為大家分別介紹客戶端需要做的。
方法一:SSL證書驗(yàn)證
一、將crt證書轉(zhuǎn)換成cer證書方法有兩種
方法1.使用openssl 進(jìn)行轉(zhuǎn)換
openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der
方法2.通過安裝crt文件,電腦導(dǎo)出
1)先打開“鑰匙串訪問”
2)選中你安裝的crt文件證書,選擇“文件”--》“導(dǎo)出項(xiàng)目”
二、AFNetworking 對數(shù)據(jù)進(jìn)行https ssl加密
1、導(dǎo)入證書并添加設(shè)置方法
+ (AFSecurityPolicy*)customSecurityPolicy
{
// /先導(dǎo)入證書
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" 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;
//假如證書的域名與你請求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書,也可以建立連接,這個(gè)非常危險(xiǎn),建議打開。
//置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個(gè)域名。因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的;當(dāng)然,有錢可以注冊通配符的域名*.google.com,但這個(gè)還是比較貴的。
//如置為NO,建議自己添加對應(yīng)域名的校驗(yàn)邏輯。
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
2、請求網(wǎng)絡(luò)時(shí)候進(jìn)行加密驗(yàn)證(引用上面方法)
+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
// 1.獲得請求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.申明返回的結(jié)果是text/html類型
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
// 加上這行代碼,https ssl 驗(yàn)證。
//[mgr setSecurityPolicy:[self customSecurityPolicy]];
// 3.發(fā)送POST請求
[mgr POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObj) {
if (success) {
success(responseObj);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure) {
failure(error);
}
}];
}
方法二:白名單設(shè)置單個(gè)http域名
解決方案:我們可以通過NSExceptionDomains設(shè)置白名單的方式來針對特定的域名開放HTTP內(nèi)容來通過審核。可以簡單理解成,把不支持https協(xié)議的接口設(shè)置成http的接口。
操作:
1)在項(xiàng)目info.plist中添加一個(gè)Key:App Transport Security Settings,類型為
Dictionary;
2)在其內(nèi)添加一個(gè)Key: Exception Domains,類型為Dictionary;
3)在Exception Domains內(nèi)添加要支持的域,其中域作為Key,類型為Dictionary;
4)每個(gè)域下面需要設(shè)置3個(gè)屬性:類型為Boolean;
NSIncludesSubdomains? YES
NSExceptionRequiresForwardSecrecy? NO
NSExceptionAllowsInsecureHTTPLoads? YES
注意:每個(gè)需添加的域都需要設(shè)置此三個(gè)屬性。如果請求的網(wǎng)絡(luò)圖片是HTTP,也是需要設(shè)置的圖片的域。