ssl之本地生成证书


 前言:

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM