iOS客户端ssl签名认证加密双向加密建议使用双向加密更好维护--修改

一个app是否做到强大的加密方式,需要一个好的后台支撑,我有幸我们公司后台哥是珍爱网出来的大神,第一次知道用到除了以前md5 base64 等等单向加密还有ssl认证加密,一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探,其实但心的黑客用伪造的ssl认证链接伪造的服务器上。

1.话不多说,首先你得要你后台给提供他的证书

2.拖到你的项目管理里面,这是你要做的,记住的项目是.cer结尾的证书。








3.我用到的是AFNetwrking这个框架。如果你自己用NSURLSession一样。


4.贴上代码

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #import "MyDataService.h"   
  2.   
  3. #import "AFNetworking.h"  
  4.   
  5.   
  6. #define BASE_URL @"xxxxxxxxx/"  
  7.   
  8. /** 
  9.  *  是否开启https SSL 验证 
  10.  * 
  11.  *  @return YES为开启,NO为关闭 
  12.  */  
  13. #define LXPopenHttpsSSL YES  
  14. /** 
  15.  *  SSL 证书名称,仅支持cer格式。
  16.  */  
  17.   
  18. #define LXPcertificate @"mykey"  
  19.   
  20. //1.开发阶段: 测试服务器 -->ip ---> 
  21. //2.上线  :  生产服务器 -->ip  -->   
  22. @implementation MyDataService  
  23.   
  24. + (NSURLSessionDataTask *)requestURL:(NSString *)urlstring  
  25.         httpMethod:(NSString *)method  
  26.             params:(NSDictionary *)params  
  27.         completion:(void(^)(id result,NSError *error))block {  
  28.       
  29.     //1.拼接URL  
  30.     NSString *url = [BASE_URL stringByAppendingString:urlstring];  

  31. #pragma mark - 设备唯一标识  
  32.     NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];  
  33. #pragma mark - 设备信号  
  34.     NSString * strModel  = [UIDevice currentDevice].model;  
  35.       
  36.     NSLog(@"%@",identifierForVendor);  
  37.     NSLog(@"%@",strModel);  
  38.       
  39.   
  40.       

  41.     //3.创建AFHTTPSessionManager对象  
  42.     AFHTTPSessionManager *af = [AFHTTPSessionManager manager];  
  43.       
  44.     NSString *userId1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"user_id"];  
  45.     NSString *token = [LXPTokenManager accessToken];  
  46.       
  47.     NSInteger aa =[userId1 integerValue];  
  48.     NSLog(@"%@",userId1);  
  49.   
  50.      //设置请求头  
  51.     if ([urlstring isEqualToString:@"noauth/loginUser.do"]||[urlstring isEqualToString:@"noauth/getProvideTypeList.do"]||[urlstring isEqualToString:@"noauth/addUser.do"]) {  
  52.           
  53.         [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];  
  54.         [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];  
  55.         [af.requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];  
  56.         [af.requestSerializer setValue:@"iOS" forHTTPHeaderField:@"client"];  
  57.           
  58.   
  59.           
  60.     }else{  
  61.       
  62.          
  63.         [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];  
  64.         [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];  
  65.         [af.requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];  
  66.         [af.requestSerializer setValue:@"iOS"forHTTPHeaderField:@"client"];  
  67.         NSLog(@"%@",userId1);  
  68.           
  69.         [af.requestSerializer setValue:[NSString stringWithFormat:@"%@",userId1] forHTTPHeaderField:@"userId"];  
  70.         [af.requestSerializer setValue:token forHTTPHeaderField:@"token"];  
  71.           
  72.   
  73.   
  74.     }  
  75.       
  76.     af.requestSerializer.timeoutInterval = 10;  
  77.   
  78.     //设置请求参数的数据格式:JSON   默认:&拼接  
  79. //    af.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:<#(NSJSONWritingOptions)#>];  
  80.       
  81.     //设置服务器返回的数据,不做解析,默认:使用JSON解析  
  82.     af.responseSerializer = [AFHTTPResponseSerializer serializer];  
  83.     // 加上这行代码,https ssl 验证。  
  84.     if(LXPopenHttpsSSL)  
  85.     {  
  86.         [af setSecurityPolicy:[self customSecurityPolicy]];  
  87.     }  
  88.     af.securityPolicy = [selfcustomSecurityPolicy];

    此处改成这样


  89.       
  90.   
  91.     NSURLSessionDataTask *task = nil;  
  92.       
  93.     //4.判断请求方式  
  94.     if ([method caseInsensitiveCompare:@"GET"] == NSOrderedSame) {  
  95.           
  96.         //发送GET请求  
  97.         task = [af GET:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {  
  98.               
  99.             block(responseObject,nil);  
  100.             NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
  101.             NSLog(@"string _____________%@", string);  
  102.   
  103.               
  104.               
  105.         } failure:^(NSURLSessionDataTask *task, NSError *error) {  
  106.              
  107.             block(nil,error);  
  108.               
  109.         }];  
  110.           
  111.           
  112.     }  
  113.     else if([method caseInsensitiveCompare:@"POST"] == NSOrderedSame) {  
  114.           
  115.         //发送POST请求  
  116.         task = [af POST:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {  
  117.               
  118.             block(responseObject,nil);  
  119. //            NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
  120. //            NSLog(@"string _____________%@", string);  
  121.   
  122.               
  123.         } failure:^(NSURLSessionDataTask *task, NSError *error) {  
  124.               
  125.             block(nil,error);  
  126.               
  127.         }];  
  128.           
  129.     }  
  130.       
  131.     return task;  
  132.       
  133. }  
  134.   
  135.   
  136. + (AFSecurityPolicy*)customSecurityPolicy  
  137. {  
  138.     // /先导入证书  
  139.     NSString *cerPath = [[NSBundle mainBundle] pathForResource:LXPcertificate ofType:@"cer"];//证书的路径  
  140.     NSData *certData = [NSData dataWithContentsOfFile:cerPath];  
  141.     NSLog(@"====%@",certData);  
  142.     NSString *string;  
  143.   
  144.     string = [[NSString alloc] initWithData:certData   encoding:NSUTF8StringEncoding];  
  145.     NSLog(@"数据%@",string);  
  146. //    NSData *data1 = [string dataUsingEncoding:NSUTF8StringEncoding];  
  147. //    NSError *e;  
  148. //    NSDictionary *dic2 = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:&e];  
  149. //    NSLog(@"=============>%@",dic2);  
  150.       
  151.       
  152.       
  153.       
  154.     //  
  155.     // AFSSLPinningModeCertificate 使用证书验证模式  
  156.     AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  //此处要改
  157.     AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];

    ;改成这样
  158.       
  159.     // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO  
  160.     // 如果是需要验证自建证书,需要设置为YES  
  161.     securityPolicy.allowInvalidCertificates = YES;  
  162.       
  163.     //validatesDomainName 是否需要验证域名,默认为YES;  
  164.     //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。  
  165.     //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。  
  166.     //如置为NO,建议自己添加对应域名的校验逻辑。  
  167.     securityPolicy.validatesDomainName = NO;  
  168.       
  169.     securityPolicy.pinnedCertificates = @[certData];  
  170.       
  171.     return securityPolicy;  
  172. }  
接下来,我们通过Charles抓取数据,抓到的数据已经加密。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值