前言:
開發環境:ios
項目需求:主域名使用CA證書,官方頒發的,一年一簽。次域名使用自建證書
本地證書保存的方式:1.直接內置cer等格式的證書文件 2.通過主域名下的接口返回證書的字符串,然后本地寫入cer文件,接着讀取出來公鑰,進行傳輸比對
為啥這么做呢?直接內置證書,會有過期問題,當然啦安全策略可以不校驗是否過期。
但如果要校驗過期呢,就可以本地寫入的方式來進行,證書即將過期的時候,后台接口返回新的證書信息字符串到app
//1.獲取文件目錄 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; //2.拼接文件名,構造字符串文件的存儲路徑 NSString *cerPath = [documentPath stringByAppendingPathComponent:@"text.cer"]; //3.讀取后台返回的公鑰文件字符串,例如下面的 NSString *foo_str = @"MIIDgDCCAmigasdfasdfPos7A7aSi/Zql"; //通過將writeToFile:atomically:encoding:error:方法發送給字符串對象完成字符串存儲到文件內的功能 [foo_str writeToFile:cerPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; //4.讀取字符串 NSString *resultStr = [NSString stringWithContentsOfFile:cerPath encoding:NSUTF8StringEncoding error:nil]; //5.替換空格,和開頭和結尾無用的字符串 resultStr = [resultStr stringByReplacingOccurrencesOfString:@"-----BEGIN CERTIFICATE-----" withString:@""]; resultStr = [resultStr stringByReplacingOccurrencesOfString:@"-----END CERTIFICATE-----" withString:@""]; resultStr = [resultStr stringByReplacingOccurrencesOfString:@"\n" withString:@""]; DLog(@"resultStr is %@", resultStr); //6.base64解碼,如果公鑰文件里面是字母數字混合的 NSData *certData = [[NSData alloc] initWithBase64EncodedString:resultStr options:0]; // NSData * certData =[NSData dataWithContentsOfFile:cerPath];//非base64編碼的,直接從文件讀取數據,轉為字節 [securityPolicy setPinnedCertificates:[NSSet setWithArray:@[certData]]]; [APIClient sharedClient].securityPolicy = securityPolicy;