在开发阶段我们我们经常使用自签名的证书来部署我们的后台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. C#/Java 程序员转GO/golang程序员笔记大全(day 01)

    前言: 整理一下学习 Go 语言的笔记,作为一名老程序,学习一名新的开发语言自然不需要像小白那样从 HelloWorld 看起. 简单整理一下 Go 的一些差异处,希望对大家学习 go 有点帮助,不正 ...

  2. Windows音频SDK的发展历程

    WASAPI is one of several native audio libraries in Windows. PortAudio actually supports five of them ...

  3. tcpdump 使用实例

    详细的文档见tcpdump高级过滤技巧 基本语法 ========过滤主机--------- 抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据# tcpdump -i eth ...

  4. DSOFramer原有的接口说明

    (转自:http://blog.csdn.net/hwbox/article/details/5669414) DSOFramer原有的接口说明 =========================== ...

  5. ElasticSearch6.0 高级应用之 多字段聚合Aggregation(二)

    ElasticSearch6.0 多字段聚合网上完整的资料很少 ,所以作者经过查阅资料,编写了聚合高级使用例子 例子是根据电商搜索实际场景模拟出来的 希望给大家带来帮助! 下面我们开始吧! 1. 创建 ...

  6. Entity Framework技术系列

    http://www.cnblogs.com/yilin/tag/Entity%20Framework/

  7. PostgreSQL时间格式及相关函数实践

    在创建表的时候,有客户需要将时间转为字符串,而且要求了具体的格式,如:20181115101010001.方便记录数据的更新时间,貌似是给Mysql使用,当时就很蛋疼,时间格式存储子啊数据库中就是va ...

  8. c# DataTable 导出csv文件

    using System; using System.Data; using System.Configuration; using System.Collections.Generic; using ...

  9. (转)Hive自定义UDAF详解

    UDAF有两种,第一种是比较简单的形式,利用抽象类UDAF和UDAFEvaluator,暂不做讨论.主要说一下第二种形式,利用接口GenericUDAFResolver2(或者抽象类AbstractG ...

  10. (转)MapReduce Design Patterns(chapter 7 (part 2))(十四)

    External Source Input Pattern Description 这种模式不从hdfs加载数据,而是从hadoop以外系统,例如RDB或web service加载. Intent 想 ...