前言:
开发环境: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;