在开发阶段我们我们经常使用自签名的证书来部署我们的后台rest api。但是在iOS中调用的时候就会因为证书不被信任而调用api不成功。这时候我们就需要通过实现某些网络回调函数来自定义证书的验证逻辑。(在iOS中一般通过UrlSession(OC中是NSUrlSession)来进行网络通信,这里以UrlSession为例)。首先我们需要了解几个概念。

Challenge     

Challenge是计算机安全中的专业术语。字面意思质询。就是为了验证用户身份,向访问者发送一个质询,然后访问者需要提供一个正确的回答以示身份。最简单的就是我们访问一个需要授权的网站,网站后台会通过HTTP协议想浏览器发送一个质询,要求用户输入用户名密码。(浏览器会弹出一个对话框供用户输入)

在iOS的网络相关库中,提供了如下几个类来描述Challenge的过程中的抽象实体。

URLProtectionSpace

这个表示服务器上的一块受保护的区域,访问这一块需要进行质询。他有如下常用属性:

// realm是ProtectionSpace的标示符,服务器上的一组资源通过realm来标示成一组采用相同验证方式的资源(ProtectionSpace)。
@property (nullable, readonly, copy) NSString *realm;
// 资源所在的服务器
@property (readonly, copy) NSString *host;
// 资源所在服务器端口
@property (readonly) NSInteger port;
//获取资源的协议资源
@property (nullable, readonly, copy) NSString *protocol;
// 质询所采用验证方式
@property (readonly, copy) NSString *authenticationMethod;

质询验证方式有如下几种是常用的:

NSURLAuthenticationMethodHTTPBasic //HTTP基本验证,服务器向客户端询问用户名,密码

NSURLAuthenticationMethodClientCertificate//客户端证书验证,服务器向客户端询客户端身份证书

NSURLAuthenticationMethodServerTrust//服务器端证书验证,客户端对服务器端的证书进行验证。HTTPS中的服务器端证书验证属于这一种。

URLAuthenticationChallenge

这就是服务器端对客户端的一次质询的描述了。它有如下常用属性:

//该质询所对应的ProtectionSpace
@property (readonly, copy) NSURLProtectionSpace *protectionSpace; //表示该质询的发送方
@property (nullable, readonly, retain) id<NSURLAuthenticationChallengeSender> sender;

UrlCredential       

他是客户端对服务器端质询的响应。根据验证方式不一样,有如下几种UrlCredential:

  • 基于用户名密码的UrlCredential
  • 基于客户端证书的UrlCredential
  • 基于服务器端证书的UrlCredential //就是我们这里验证服务器端的证书要用到的

它们分别对应于UrlCredential的三种构造方式。详情参考Apple开发文档

SecTrust         

他是iOS中对证书和Accept Policy的包装。系统对后台证书验证实际上是对该对象的验证。详情建Apple开发文档

好了,到这里所有的概念性的东西都说完了。最后就是要把这些概念全部组合到UrlSession的一个回调方法中来自行验证证书。代码如下:

//这是NSUrlSessionDelegate总定义的函数,因此先需要设置NSUrlSession对象的delegate,然后再delegate对象中实现该方法
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
  //这里检查质询的验证方式是否是服务器端证书验证
if([challenge.protectionSpace.authenticationMethod isEqualToString: NSURLAuthenticationMethodServerTrust])
{
     //这里直接把证书包装对象拿到,
SecTrustRef trustRef = [challenge.protectionSpace serverTrust];
     // 使用证书SecTrust对象来构造URLCredential,系统默认实现这里应该是要对SecTrust进行验证,而此处我们的目的就是要信任所有证书。因此跳过验证这一步。
id trustCredential = [NSURLCredential credentialForTrust:trustRef];
     //通过回调函数告诉系统对于该质询的UrlCredential.
completionHandler(NSURLSessionAuthChallengeUseCredential, trustCredential);
} else {
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
}
}

通过Authentication Challenge来信任自签名Https证书的更多相关文章

  1. 使用openssl创建一个自签名https证书,并配置到nginx里面

    公司内网也有这个需求,就简单实现一下. 参考的都是网上的方案,一次过. 1,使用openssl建立服务器私钥(需要输入密码,请记住这个密码)生成RSA密钥 >openssl genrsa -de ...

  2. Android HTTPS如何10分钟实现自签名SSL证书

    前言 去年公司内一个应用加了支付宝支付功能,为了保证安全,支付请求链接写成了https. 由于公司服务器使用的是的自签名证书,而在Android系统中自己签署的不能通过验证的,所以会抛出错误. 于是我 ...

  3. 基于HttpClient 4.3的可訪问自签名HTTPS网站的新版工具类

    本文出处:http://blog.csdn.net/chaijunkun/article/details/40145685,转载请注明.因为本人不定期会整理相关博文,会对相应内容作出完好.因此强烈建议 ...

  4. office加载项部署清单签名的证书或其位置不受信任

    异常信息: System.Security.SecurityException: 此应用程序中的自定义功能将不起作用,原因是用于为 BIMT写作指导 的部署清单签名的证书或其位置不受信任.请向管理员寻 ...

  5. 自签名的https证书是不安全的

    一.项目内的需求 我们做的app都是企业级的应用,而企业级的应用的下载需要遵循itms协议,itms协议下需要https链接,这就需要你的服务器支持https的协议,该协议需要申请SSL证书,我们测试 ...

  6. https 自签名SSL证书

    介绍 TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议. 使用这种技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截 ...

  7. 【倒腾HTTPS】Nginx for Docker自签名SSL证书

    前言 合格的web程序员, 必须能自由在 IIS. Nginx. Nginx for Docker上配置Https服务, 博客最近将专题记录 Https  &   Hsts 如何申请适用于生产 ...

  8. mac 浏览器(chrome, safari)信任自签名证书

    mac 浏览器(chrome, safari)信任自签名证书 自签名证书创建了一个 https 服务器,但是浏览器访问的时候总是不信任证书,感觉很烦,就想如果信任这个证书就不会有问题了. 方法1: 直 ...

  9. Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求

    为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比ht ...

随机推荐

  1. [less]用webstorm自动编译less产出css和sourcemap

    css产出sourcemap有什么用呢,可能大家要问这个问题了. 请移步这里 https://developers.google.com/chrome-developer-tools/docs/css ...

  2. MySQLdb和PIL安装

    最近将个人博客部署到树莓派上海真是颇费周折,尤其是在MySQLdb和PIL的安装上 MySQLdb 先说Windows吧(比较简单) 直接pip安装即可或者下载编译版更方便:http://source ...

  3. 034——VUE中表单控件处理之使用vue控制radio表单的实例操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 201621123014《Java程序设计》第五周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:接口.interface.implements.Comparable.Comparator 1.2 尝试使用思维导图将这些关 ...

  5. 将VIM打造成强大的IDE

    转载自:所需即所获:像 IDE 一样使用 vim 如侵犯您的版权,请联系:2378264731@qq.com --------------------------------------------- ...

  6. flowable ProcessEngine和ProcessEngineConfiguration

    ProcessEngine是流程引擎,ProcessEngineConfiguration与前面四个引擎配置有些不同. ProcessEngineConfiguration增加了邮件服务和httpCl ...

  7. 从零开始编写深度学习库(五)PoolingLayer 网络层CPU编写

    记录:编写卷积层和池化层,比较需要注意的细节就是边界问题,还有另外一个就是重叠池化的情况,这两个小细节比较重要,边界问题pad在反向求导的时候,由于tensorflow是没有计算的,另外一个比较烦人的 ...

  8. caffe 卷积层的运算

    贾清扬寻找快速算法之路:https://github.com/Yangqing/caffe/wiki/Convolution-in-Caffe:-a-memo 卷积运算图文并茂:http://www. ...

  9. GitHub https链接中输入账户和密码

    /********************************************************************** * GitHub https链接中输入账户和密码 * 说 ...

  10. Qt 使用#define+qDebug()输出调试信息

    /******************************************************************************************* * Qt 使用 ...