玩了半年的Android和Java后端,最近又回来搞iOS了。
做开发本着能用最新就用最新的原则,所以战略放弃了NSURLConnection,改用NSURLSession。
而且苹果倡导使用https,并且这也是未来的趋势。所以就直接上了。
我们平时在访问https的网页时会出现证书过期啊、不受信任等问题,弹出一个对话框选择是否信任证书这样的情况。For example,12306某些页面打开因为是https,所以可能出现对话框说证书不信任。而GitHub虽然也是https,但是不会出现这样的问题。
那么我们在开发过程中,如果后端使用了私有的证书,也会出现这样的问题吧,如果不信任的话,不管是调用接口还是打开网页,都会失败。
那么如何去信任证书呢?

  //2程序自动安装证书的方式NSURLSession *sesson = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];

首先我们要设置NSURLSession,添加代理方法。

 NSURLSession * sesson = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

注意:不能使用上面的这个方法,这样是进不去代理方法的!

然后在代理方法中实现对证书的操作
方法一:这是在开发者足够信任后端的安全的情况下做的,比如调个接口,这样做的结果就是忽略证书的验证,直接信任。

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){//服务器信任证书NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];//服务器信任证书if(completionHandler)completionHandler(NSURLSessionAuthChallengeUseCredential,credential);}
}

方法二:可以把证书加到工程中,然后https访问时在代理方法中进行证书的验证

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{SecTrustRef servertrust = challenge.protectionSpace.serverTrust;SecCertificateRef certi= SecTrustGetCertificateAtIndex(servertrust, 0);NSData *certidata = CFBridgingRelease(CFBridgingRetain(CFBridgingRelease(SecCertificateCopyData(certi))));NSString *path = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];NSData *localCertiData = [NSData dataWithContentsOfFile:path];if ([certidata isEqualToData:localCertiData]) {NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:servertrust];[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];completionHandler(NSURLSessionAuthChallengeUseCredential, credential);NSLog(@"服务端证书认证通过");}else {completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);NSLog(@"服务端认证失败");}}

OK,这样就可以访问https的接口、网页了。


- (void)getWithUrlString:(NSString *)f_str_url NSString:(NSString *)f_aTC_String success:(SuccessBlock)successBlock failure:(FailureBlock)failureBlock{NSMutableString * t_aTC_mutableUrl = [[NSMutableString alloc] initWithString:f_str_url];[t_aTC_mutableUrl appendString:f_aTC_String];NSLog(@"url %@",t_aTC_mutableUrl);NSURL * t_aTC_URL =[NSURL URLWithString:[t_aTC_mutableUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];NSURLRequest * t_aTC_urlRequest = [NSURLRequest requestWithURL:t_aTC_URL];//2程序自动安装证书的方式NSURLSession *sesson = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];NSURLSessionDataTask * t_aTC_dataTask = [sesson dataTaskWithRequest:t_aTC_urlRequest completionHandler:^(NSData * _Nullable t_aTC_data, NSURLResponse * _Nullable t_aTC_response, NSError * _Nullable t_aTC_error) {if (t_aTC_error) {failureBlock(t_aTC_error);} else {NSString * t_str_result = [[NSString alloc] initWithData:t_aTC_data  encoding:NSUTF8StringEncoding];successBlock(t_str_result);}}];[t_aTC_dataTask resume];}
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{/*方法一*/if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){//服务器信任证书NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];//服务器信任证书if(completionHandler)completionHandler(NSURLSessionAuthChallengeUseCredential,credential);}/*方法二*/SecTrustRef servertrust = challenge.protectionSpace.serverTrust;SecCertificateRef certi= SecTrustGetCertificateAtIndex(servertrust, 0);NSData *certidata = CFBridgingRelease(CFBridgingRetain(CFBridgingRelease(SecCertificateCopyData(certi))));NSString *path = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];NSData *localCertiData = [NSData dataWithContentsOfFile:path];if ([certidata isEqualToData:localCertiData]) {NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:servertrust];[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];completionHandler(NSURLSessionAuthChallengeUseCredential, credential);NSLog(@"服务端证书认证通过");}else {completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);NSLog(@"服务端认证失败");}}

iOS NSURLSession Https请求相关推荐

  1. IOS之https请求认证及双向认证

    一.背景: 苹果从IOS9.0以后就要求使用https,今年发布说的是在2017年1月1日后,所有上架的APP必须使用HTTPS(貌似目前推迟了).不论怎么说,使用https时迟早的事情,之前通过在i ...

  2. iOS使用自签名证书实现HTTPS请求

    原文链接:http://www.jianshu.com/p/e6a26ecd84aa 由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS ...

  3. iOS 用自签名证书实现 HTTPS 请求的原理实例讲解

    在16年的WWDC中,Apple已表示将从2017年1月1日起,所有新提交的App必须强制性应用HTTPS协议来进行网络请求.默认情况下非HTTPS的网络访问是禁止的并且不能再通过简单粗暴的向Info ...

  4. iOS 用自签名证书实现 HTTPS 请求的原理

    在16年的WWDC中,Apple已表示将从2017年1月1日起,所有新提交的App必须强制性应用HTTPS协议来进行网络请求.默认情况下非HTTPS的网络访问是禁止的并且不能再通过简单粗暴的向Info ...

  5. iOS 10.3下使用Fiddler抓取HTTPS请求

    最近使用Fiddler抓取手机上的HTTPS请求时,遇到一个问题.设置完之后,访问HTTPS的页面,却得到一个错误 网络出错,轻触屏幕重新加载:-1202 (如下图所示) 我印象中,之前都好好的,怎么 ...

  6. Charles抓包(iOS的http/https请求)

    Charles安装 官网下载安装Charles: https://www.charlesproxy.com/download/ 2. HTTP抓包 (1)查看电脑IP地址 (2)设置手机HTTP代理 ...

  7. charles浏览器抓包https_十分钟学会Charles抓包(iOS的http/https请求)

    Charles安装 HTTP抓包 HTTPS抓包 1. Charles安装 2. HTTP抓包 (1)查看电脑IP地址 Help→Local IP Address查看本机地址 电脑IP地址 (2)设置 ...

  8. 关于IOS由于Dropbox被封,https请求不好用的解决办法

    最近研究IOS的In-House安装方法,好不容易申请下来了企业级证书,也使用了Dropbox的网盘来支持苹果的In-House安装方法,也给客户展示了,下载的地址也给客户了.没过几天,坑爹的天朝把D ...

  9. iOS 对https App内部的http请求进行白名单设置

    苹果从iOS9开始要求应用使用Https链接来对请求进行加密,来保证数据的安全.如果使用http请求将会报错,当然,如果你想继续使用http请求,有两种方式: 1.使用ASIHttpRequest来请 ...

最新文章

  1. 通过销售订单领用到成本中心,FI替代实现不同成本中心记账科目不同
  2. python方差特征选择_使用scikitlearn进行方差分析的特征选择和交叉验证
  3. 用实例证明dll中new的内存不能在exe中释放
  4. android JNI调用(Android Studio 3.0.1)(转)
  5. Java学习资源整理(超级全面),java基础面试笔试题
  6. 10.MongoDB连接模型(长连接vs短连接vs连接池)
  7. go 实现单链表反转
  8. Vlmcsd: 自建 KMS 激活服务器
  9. 为什么很少人用redmine_为什么古代书法家要把字写歪?
  10. Android 仿小米的全面屏手势-侧滑返回
  11. Ubuntu18.04安装RTL8125/RTL8168等网卡驱动程序
  12. 【CTF WriteUp】2020电信和互联网行业赛个人赛部分Crypto题解
  13. 物理系统之碰撞检测——碰撞器
  14. 北京数码视讯s905l固件_数码视讯Q6联通版S905L芯片第三方刷机固件
  15. 深度中国——课后随感
  16. (debug)vue-pdf预览时公式里的英文乱码
  17. 初学者用Qt实现小型运动会成绩管理软件
  18. 第11周 oj 判断三角形
  19. 基于SSM美发店管理系统
  20. 毕业设计 基于STM32单片机的水箱水位控制系统

热门文章

  1. php active cms 下载,phpcom cms下载
  2. 【阿里云高校计划】视觉Al训练营五天训练第一天笔记
  3. 2022-2028年全球冷冻油收入年复合增长率CAGR为 2.6%
  4. gff文件转入mysql_详解GFF转换为GTF文件
  5. 51单片机中串口波特率的计算方法详解
  6. Hive 临时修改非严格模式
  7. 一位粗心的同学在用计算机计算某题时,浅谈如何纠正小学生在数学中做题粗心的问题...
  8. 勤劳肯干的员工离职,原因在谁?
  9. C++有限状态机的实现
  10. Android各平台模拟器分辨率 .