在开发阶段我们我们经常使用自签名的证书来部署我们的后台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. HDU 5687 字典树入门

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  2. 为什么MVC不是一种设计模式?

    引用一段话: GoF (Gang of Four,四人组, <Design Patterns: Elements of Reusable Object-Oriented Software> ...

  3. HDU 4681 STRING dp+暴力。

    题意:不说了很好懂. 这题这么水= =...当时竟然没有勇气暴力搜一下.昨天(好吧前天.)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列.其实优化一 ...

  4. Ubuntu 下Python 环境问题

    问题描述: 原先使用Anaconda环境,若卸载后仍不能恢复到系统默认的Python环境. 解决方案: shell 寻找缓存路径,python的扩展/home/tom/anaconda/bin/pyt ...

  5. ansible入门一(Ansible介绍及安装部署)

    本节内容: 运维工具 Ansible特性 Ansible架构图和核心组件 安装Ansible 演示使用示例 一.运维工具 作为一个Linux运维人员,需要了解大量的运维工具,并熟知这些工具的差异,能够 ...

  6. 常用js、jquery 语句(句型)

    1.动态更改设置属性(class  style 都是属性) $("#sendPhoneNum").attr("class", "n_input3&qu ...

  7. 006——数组(六)array_fill()array_filter()array_flip()array_key_exists()array_keys()

    <?php /*数组(六)array_fill()array_filter()array_flip()array_key_exists()array_keys() */ /*1.array_fi ...

  8. Sql sever 事务

    SQL事务 一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务 ...

  9. Ti IPNC Web网页之ActiveX控件

    Ti IPNC Web网页之ActiveX控件 本篇介绍关于TI IPNC网页中播放器相关的东西. gStudio工程中添加播放器并控制播放器 打开IPNC网页时首先会自动下载ActiveX控件并安装 ...

  10. react 生命周期图

    1. react v16 版本生命周期 2. react v17 (还未发布), 生命周期将被改动,下面红框的部分就是会被删除的部分,注意调整!