iOS 使用Https访问网络(一)

关于https和ssl的原理,请到此处查看:http://blog.163.com/magicc_love/blog/static/185853662201321423527263/


由于项目需求,访问服务是https的,并且使用的是ssl加密方式

下面说明使用MKNetworkit网络库实现的代码:

  1. - (void)testClientCertificate {  
  2.   SecIdentityRef identity = NULL;  
  3.   SecTrustRef trust = NULL;  
  4.   NSString *p12 = [[NSBundle mainBundle] pathForResource:@"testClient" ofType:@"p12"];  
  5.   NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];  
  6.     
  7.   [[self class] extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data];  
  8.     
  9.   NSString *url = @"https://218.244.131.231/ManicureShop/api/order/pay/%@";  
  10.   NSDictionary *dic = @{@"request" : @{  
  11.                             @"orderNo" : @"1409282102222110030643",  
  12.                             @"type" : @(2)  
  13.                             }  
  14.                         };  
  15.     
  16.   _signString = nil;  
  17.   NSData *postData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];  
  18.   NSString *sign = [self signWithSignKey:@"test" params:dic];  
  19.   NSMutableData *body = [postData mutableCopy];  
  20.   NSLog(@"%@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);  
  21.   url = [NSString stringWithFormat:url, sign];  
  22.     
  23.   MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"218.244.131.231"];  
  24.   MKNetworkOperation *op = [engine operationWithPath:[NSString stringWithFormat:@"/ManicureShop/api/order/pay/%@", sign] params:dic httpMethod:@"POST" ssl:YES];  
  25.   op.postDataEncoding = MKNKPostDataEncodingTypeJSON; // 传JOSN  
  26.     
  27.   // 这个是app bundle 路径下的自签证书  
  28.   op.clientCertificate = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"testClient.p12"];  
  29.   // 这个是自签证书的密码  
  30.   op.clientCertificatePassword = @"testHttps";  
  31.     
  32.   // 由于自签名的证书是需要忽略的,所以这里需要设置为YES,表示允许  
  33.   op.shouldContinueWithInvalidCertificate = YES;  
  34.   [op addCompletionHandler:^(MKNetworkOperation *completedOperation) {  
  35.     NSLog(@"%@", completedOperation.responseJSON);  
  36.   } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {  
  37.     NSLog(@"%@", [error description]);  
  38.   }];  
  39.     
  40.   [engine enqueueOperation:op];  
  41.   return;  
  42. }  


// 下面这段代码是提取和校验证书的数据的
  1. + (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef*)outTrust fromPKCS12Data:(NSData *)inPKCS12Data {  
  2.   OSStatus securityError = errSecSuccess;  
  3.     
  4.   // 证书密钥  
  5.   NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:@"testHttps"  
  6.                                                                 forKey:(__bridge id)kSecImportExportPassphrase];  
  7.     
  8.   CFArrayRef items = CFArrayCreate(NULL00NULL);  
  9.   securityError = SecPKCS12Import((__bridge CFDataRef)inPKCS12Data,(__bridge CFDictionaryRef)optionsDictionary,&items);  
  10.     
  11.   if (securityError == 0) {  
  12.     CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);  
  13.     const voidvoid *tempIdentity = NULL;  
  14.     tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);  
  15.     *outIdentity = (SecIdentityRef)tempIdentity;  
  16.     const voidvoid *tempTrust = NULL;  
  17.     tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);  
  18.     *outTrust = (SecTrustRef)tempTrust;  
  19.   } else {  
  20.     NSLog(@"Failed with error code %d",(int)securityError);  
  21.     return NO;  
  22.   }  
  23.   return YES;  
  24. }  




下面说明一下使用AFNetworking网络库访问的方式:

  1. - (void)testClientCertificate {  
  2.   SecIdentityRef identity = NULL;  
  3.   SecTrustRef trust = NULL;  
  4.   NSString *p12 = [[NSBundle mainBundle] pathForResource:@"testClient" ofType:@"p12"];  
  5.   NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];  
  6.     
  7.   [[self class] extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data];  
  8.     
  9.   NSString *url = @"https://218.244.131.231/ManicureShop/api/order/pay/%@";  
  10.   NSDictionary *dic = @{@"request" : @{  
  11.                             @"orderNo" : @"1409282102222110030643",  
  12.                             @"type" : @(2)  
  13.                             }  
  14.                         };  
  15.     
  16.   _signString = nil;  
  17.   NSData *postData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];  
  18.   NSString *sign = [self signWithSignKey:@"test" params:dic];  
  19.   NSMutableData *body = [postData mutableCopy];  
  20.   NSLog(@"%@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);  
  21.   url = [NSString stringWithFormat:url, sign];  
  22.     
  23.   AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  24.   manager.requestSerializer = [AFJSONRequestSerializer serializer];  
  25.   manager.responseSerializer = [AFJSONResponseSerializer serializer];  
  26.   [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];  
  27.   [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];  
  28.   manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json"@"text/plain"]];  
  29.   manager.securityPolicy = [self customSecurityPolicy];  
  30.     
  31.   [manager POST:url parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  32.     NSLog(@"JSON: %@", responseObject);  
  33.   } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  34.       
  35.     NSLog(@"Error: %@", error);  
  36.   }];  
  37. }  

下面这段代码是处理SSL安全性问题的:
  1. /**** SSL Pinning ****/  
  2. - (AFSecurityPolicy*)customSecurityPolicy {  
  3.   NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"testClient" ofType:@"cer"];  
  4.   NSData *certData = [NSData dataWithContentsOfFile:cerPath];  
  5.   AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];  
  6.   [securityPolicy setAllowInvalidCertificates:YES];  
  7.   [securityPolicy setPinnedCertificates:@[certData]];  
  8.   [securityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];  
  9.   /**** SSL Pinning ****/  
  10.   return securityPolicy;  
  11. }  




为了实现访问https tls加密方式,我也费了不少时间来查,这里写下此文章,希望对大家有用!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值