个NSURLProtectionSpace提供如下信息:

//401的认证方式的realm字段的值

(NSString*)realm;

//401的认证方式,指定是否密码发送安全。

-(BOOL)receivesCredentialSecurely;

//代理授权

-(BOOL)isProxy;

//服务端主机地址,如果是代理则代理服务器地址

-(NSString *)host;

//服务端端口地址,如果是代理则代理服务器的端口

-(NSInteger)port;

//代理类型,只对代理授权,比如http代理,socket代理等。

-(NSString *)proxyType;

//使用的协议,比如http,https, ftp等,

-(NSString *)protocol;

//最关键字段,指定授权方式,比如401,客户端认证,服务端信任,代理等。

-(NSString *)authenticationMethod;

//客户端认证,是指定可接受的客户端证书列表??表示只有这些证书才可以??

-(NSArray *)distinguishedNames NS_AVAILABLE(10_6,3_0);

//用于服务端信任,指定一个信任对象,可以用这个对象来建立一个凭证。

-(SecTrustRef)serverTrust NS_AVAILABLE(10_6,3_0);

保护空间的建立提供2个方法:

(id)initWithHost:(NSString*)host port:(NSInteger)port protocol:(NSString *)protocolrealm:(NSString *)realm authenticationMethod:(NSString*)authenticationMethod;

//代理的保护空间

-(id)initWithProxyHost:(NSString*)host port:(NSInteger)port type:(NSString *)type realm:(NSString*)realm authenticationMethod:(NSString *)authenticationMethod;

好了有了保护空间类,也凭证类我们就可以把信息从凭证空间读取或者保存了,凭证空间提供了如下的方法:

//根据保护空间得到凭证对象字典,这个字典的key是用户名,而value是NSURLCredential

-(NSDictionary *)credentialsForProtectionSpace:(NSURLProtectionSpace*)space;

//所有凭证对象字典,key是保护空间,value是一个字典,其中value的key是用户名字,value是凭证

-(NSDictionary *)allCredentials;

//保存凭证

-(void)setCredential:(NSURLCredential*)credential forProtectionSpace:(NSURLProtectionSpace *)space;

//删除凭证

-(void)removeCredential:(NSURLCredential*)credential forProtectionSpace:(NSURLProtectionSpace *)space;

//设置某个保护空间的默认凭证

-(NSURLCredential*)defaultCredentialForProtectionSpace:(NSURLProtectionSpace *)space;

//获取某个凭证空间的默认凭证

-(void)setDefaultCredential:(NSURLCredential*)credential forProtectionSpace:(NSURLProtectionSpace *)space;

当我们的凭证存储空间有变化时会发送FOUNDATION_EXPORTNSString *constNSURLCredentialStorageChangedNotification;通知。

好了说了这么多,然我们来继续看看挑战类吧NSURLAuthenticationChallenge,一个挑战类会包含:保护空间信息,凭证类(如果有的话),

我们再来捋顺一下逻辑,当我们发送请求到服务端时,服务端需要我们挑战时会在客户端创建一个挑战对象NSURLAuthenticationChallenge,其中的保护空间NSURLProtectionSpace由服务器响应的信息来构建,而<NSURLAuthenticationChallengeSender>sender则内部构建,然后挑战对象会根据保护空间从凭证存储中获取对应的凭证对象,如果有凭证对象则会把凭证对象赋值给数据成员proposedCredential,建立挑战对象后判断当前有没有实现NSURLConnection的willSendRequestForAuthenticationChallenge的函数,如果没有实现则根据凭证对象来调用sender的接受挑战或者失败函数,而如果是我们实现了willSendRequestForAuthenticationChallenge就需要我们自己来处理如何接收挑战了,注意当我们调用sender的接收挑战函数,这个函数内部会把凭证和保护空间保存到凭证存储中去,以便下次继续使用(当然可以通过控制凭证的持久属性来决定是否保存)。因此有的时候我们可以在系统中预先植入一些特定服务器的保护空间和凭证,这样我们就不需要去处理willSendRequestForAuthenticationChallenge函数了,这种机制特别有效的用于处理webview来访问有些需要授权的或者https或者代理等等。

http://blog.csdn.net/antjumper/article/details/51567945

NSURLProtectionSpace 证书认证的上下文相关推荐

  1. iOS手机客户端https请求忽略证书认证

    //设置证书,在客户端默认忽略证书认证 - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectio ...

  2. 通过双向证书认证使用 gSOAP 访问 web services

    概述 本文通过一系列的实验步骤描述,向您展示如何使用 gSOAP 编写的客户端,通过双向证书认证,访问由 tomcat7 和 Axis2 搭建的 web 服务.全文循序渐进,分为几个阶段逐步展开,每个 ...

  3. docker远程访问TLS证书认证shell

    docker开启远程访问端口,防止非法访问 配置证书认证 配置防火墙或安全策略 #!/bin/bash # docker.tls.sh # 环境centos 7 ,root # 创建 Docker T ...

  4. php curl 不验证ssl,PHP Curl https跳过ssl证书认证报错记录及解决

    PHP Curl https跳过ssl证书认证报错记录及解决 function get($url = '', $cookie = '') { $ch = curl_init(); curl_setop ...

  5. nginx添加ssl证书认证

    让nginx支持ssl证书认证首先安装上openssl,然后执行以下命令: openssl genrsa -out sim.key 1024 openssl req -new -key sim.key ...

  6. java实现https免证书认证

    java实现https免证书认证 解决方法: 1.下载两个包,httpclient-4.2.jar和httpcore-4.2.jar,复制以下代码就可使用. 2.调用类代码: String httpO ...

  7. Zimbra高级应用之-双向证书认证(一)

    使用zimbra作为企业邮件服务器的公司,可能会遇到这样一种情况:使用用户名+密码的传统认证方法,经常会发现有人恶意登录用户邮箱,采取暴力 破解,不断尝试登录密码.同时,简单密码组合很轻易被破解.从而 ...

  8. F5基于证书认证的客户端登录

    1.生成密钥RSA类型,密码:123456 保存为Openssl格式 2.上传客户机SecureCRT生成的公钥 Identity.pub到用户home目录下.ssh文件夹中 cd .ssh mv I ...

  9. 简述 HTTPS 证书认证

    前言 在我们不论是对服务器还是客户端进行 HTTPS 进行配置时,首先需要准备好的肯定是相关证书文件了,而证书文件是什么又从哪里可以获取到相关证书,并且它们又是什么关系,最后它们怎么在通讯中起作用呢? ...

最新文章

  1. wxWidgets 电源管理示例
  2. 处理本地能登陆mysql但navicat连接不上的问题
  3. 【Quartz】Spring3.2.9 + Quqrtz2.2.1 实现定时实例
  4. 云漫圈 | 学Python还是Java, 8张漫画带你全面分析
  5. ZJU cluster
  6. jquery 给a标签加上或去掉下划线
  7. 如何使用UltraCompare对比两个文件夹内容差异
  8. SHU OJ 420 购买装备(假装背包,其实贪心)
  9. 【论文简述】CVP-MVSNet:Cost Volume Pyramid Based Depth Inference for Multi-View Stereo(CVPR 2020)
  10. 如何查找北京驾照体检医院
  11. pythonstdin_详解Python 中sys.stdin.readline()的用法
  12. 吸粉神器——维盟智慧wifi,微信粉丝生产基地!
  13. 2019吉大软件C++课设——模拟即时通信系统
  14. React.js简单轮播图组件封装
  15. BPF学习笔记(六)-- 使用bpf实现xdp的例子
  16. 滚动率、Vintage、WOE、IV、LIFT、PSI、GINI
  17. 百度AI开放平台人体分析_人像分割的Python示例代码
  18. 扎拉赞恩 服务器 微信群,魔兽世界怀旧服1至60级练级任务攻略——部落篇1
  19. 深入解析 Vue 的热更新原理,尤大是如何巧用源码中的细节?
  20. Linux_linux中LT和ET的区别

热门文章

  1. 我最喜欢的几个苏州美食
  2. 是什么阻止了自动驾驶汽车上路?
  3. 这应该是全网最好的「机器学习」科普文
  4. AAAI 2020 | 通过解纠缠模型探测语义和语法的大脑表征机制
  5. 为什么说特斯拉在自动驾驶上比Waymo更占优势
  6. 李飞飞最新访谈:我每天都在对AI的担忧中醒来
  7. 资源丨机器学习进阶路上不可错过的28个视频
  8. 深度丨AlphaGo Zero的启示:监督学习和无监督学习的利弊
  9. 2022年斯坦福AI Index公布:中美主导跨国研究,专利、投资金额暴增
  10. 脑机接口猴子通过“意念”打游戏!马斯克:未来能让瘫痪者用意念玩手机