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 证书认证的上下文相关推荐
- iOS手机客户端https请求忽略证书认证
//设置证书,在客户端默认忽略证书认证 - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectio ...
- 通过双向证书认证使用 gSOAP 访问 web services
概述 本文通过一系列的实验步骤描述,向您展示如何使用 gSOAP 编写的客户端,通过双向证书认证,访问由 tomcat7 和 Axis2 搭建的 web 服务.全文循序渐进,分为几个阶段逐步展开,每个 ...
- docker远程访问TLS证书认证shell
docker开启远程访问端口,防止非法访问 配置证书认证 配置防火墙或安全策略 #!/bin/bash # docker.tls.sh # 环境centos 7 ,root # 创建 Docker T ...
- php curl 不验证ssl,PHP Curl https跳过ssl证书认证报错记录及解决
PHP Curl https跳过ssl证书认证报错记录及解决 function get($url = '', $cookie = '') { $ch = curl_init(); curl_setop ...
- nginx添加ssl证书认证
让nginx支持ssl证书认证首先安装上openssl,然后执行以下命令: openssl genrsa -out sim.key 1024 openssl req -new -key sim.key ...
- java实现https免证书认证
java实现https免证书认证 解决方法: 1.下载两个包,httpclient-4.2.jar和httpcore-4.2.jar,复制以下代码就可使用. 2.调用类代码: String httpO ...
- Zimbra高级应用之-双向证书认证(一)
使用zimbra作为企业邮件服务器的公司,可能会遇到这样一种情况:使用用户名+密码的传统认证方法,经常会发现有人恶意登录用户邮箱,采取暴力 破解,不断尝试登录密码.同时,简单密码组合很轻易被破解.从而 ...
- F5基于证书认证的客户端登录
1.生成密钥RSA类型,密码:123456 保存为Openssl格式 2.上传客户机SecureCRT生成的公钥 Identity.pub到用户home目录下.ssh文件夹中 cd .ssh mv I ...
- 简述 HTTPS 证书认证
前言 在我们不论是对服务器还是客户端进行 HTTPS 进行配置时,首先需要准备好的肯定是相关证书文件了,而证书文件是什么又从哪里可以获取到相关证书,并且它们又是什么关系,最后它们怎么在通讯中起作用呢? ...
最新文章
- wxWidgets 电源管理示例
- 处理本地能登陆mysql但navicat连接不上的问题
- 【Quartz】Spring3.2.9 + Quqrtz2.2.1 实现定时实例
- 云漫圈 | 学Python还是Java, 8张漫画带你全面分析
- ZJU cluster
- jquery 给a标签加上或去掉下划线
- 如何使用UltraCompare对比两个文件夹内容差异
- SHU OJ 420 购买装备(假装背包,其实贪心)
- 【论文简述】CVP-MVSNet:Cost Volume Pyramid Based Depth Inference for Multi-View Stereo(CVPR 2020)
- 如何查找北京驾照体检医院
- pythonstdin_详解Python 中sys.stdin.readline()的用法
- 吸粉神器——维盟智慧wifi,微信粉丝生产基地!
- 2019吉大软件C++课设——模拟即时通信系统
- React.js简单轮播图组件封装
- BPF学习笔记(六)-- 使用bpf实现xdp的例子
- 滚动率、Vintage、WOE、IV、LIFT、PSI、GINI
- 百度AI开放平台人体分析_人像分割的Python示例代码
- 扎拉赞恩 服务器 微信群,魔兽世界怀旧服1至60级练级任务攻略——部落篇1
- 深入解析 Vue 的热更新原理,尤大是如何巧用源码中的细节?
- Linux_linux中LT和ET的区别