NSURLProtectionSpace 证书认证的上下文
个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 证书认证的上下文的更多相关文章
- JAVA中SSL证书认证通讯
JAVA中SSL证书认证通讯 SSL通讯服务端 /******************************************************************** * 项目名称 ...
- tomcat 配置客户端证书认证
在完成配置客户端证书认证后,浏览器以https访问服务器的时候,会提示选择证书,之后,服务器端会验证证书.也就意味着只有拥有有效证书的客户端才能打开该网站. 以下是具体的配置过程. 1. 在服务器端生 ...
- 不同服务器之间使用svn钩子post-commit同步代码遇到的证书认证问题.md
遇到的问题,以下其他问题都是因解决这个问题引申出来的问题 VisualSVN hooks自动同步更新到web服务器 错误信息如下: Error validating server certificat ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种,实测成功)
以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...
- APK安装时的过滤方式:包名白名单、证书认证
1.定义一些全局变量,文件位置: Build.java (frameworks\base\core\java\android\os) /** * 包管理方式名称<br> * whiteli ...
- Https握手协议以及证书认证
1. 什么是https Https = http + 加密 + 认证 https是对http的安全强化,在http的基础上引入了加密和认证过程.通过加密和认证构建一条安全的传输通道.所以https可以 ...
- UIWebView 跳过HTTPS证书认证
UIWebView跳过证书认证 在UIWebView中加入如下代码即可(Error Domain=NSURLErrorDomain Code=-1202) //跳过证书验证 @interface NS ...
- QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- SSL通信-忽略证书认证错误
.NET的SSL通信过程中,使用的证书可能存在各种问题,某种情况下可以忽略证书的错误继续访问.可以用下面的方式跳过服务器证书验证,完成正常通信. 1.设置回调属性ServicePointManager ...
随机推荐
- 洛谷 P1348 Couple number
题目描述 任何一个整数N都能表示成另外两个整数a和b的平方差吗?如果能,那么这个数N就叫做Couple number.你的工作就是判断一个数N是不是Couple number. 输入输出格式 输入格式 ...
- springCloud学习-断路器(Hystrix)
1.问题分析 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高 ...
- Spring MVC-表单(Form)标签-单选按钮集合(RadioButtons)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_radiobuttons.htm 说明:示例基于Spring MVC 4.1.6. ...
- Android:阻止输入法将图片压缩变形
Scrollview定义中添加一行: android:isScrollContainer="false"
- Unity查找脚本被哪些Perfab或场景引用
Unity中查找脚本被哪些Prefab或场景引用 Unity中有个Find References In Scene的功能,可是仅仅能查找在当前场景中的引用. 假设发现某个脚本不知道被挂在哪个Prefa ...
- 027依据前序遍历和中序遍历,重建二叉树(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中 ...
- HDU 4598
这道题其实不需要考虑具体数值,但可以肯定的是,相连边的两端点必定有一正一负,至于谁正谁负,并不重要,这是可以思考的,很明显的一个二分图性质,如果不满足此条件,是不可能满足题目第二个条件的.所以首先对题 ...
- HDU4882ZCC Loves Codefires(贪心)
ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 持续集成(CI)工具------Hudson/Jenkins(Continuous Integration)安装与配置具体解释
本文同意转载.但请标明出处:http://blog.csdn.net/wanghantong/article/40985653/, 版权全部 文章概述: 一. 描写叙述了持续集成工具Hudson的安装 ...
- Hypercall
在Linux中.大家应该对syscall很的了解和熟悉,其是用户态进入内核态的一种途径或者说是一种方式.完毕了两个模式之间的切换:而在虚拟环境中,有没有一种类似于syscall这样的方式.可以从no ...