欢迎来到天天文库
浏览记录
ID:1123941
大小:226.00 KB
页数:11页
时间:2017-11-07
《[无限互联]afnetworking源码之afsecuritypolicy模块》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、续AFNetworking综述,NSURLConnection模块,Serialization模块AFSecurityPolicyNSURLConnection已经封装了https连接的建立、数据的加密解密功能,我们直接使用NSURLConnection是可以访问https网站的,但NSURLConnection并没有验证证书是否合法,无法避免中间人攻击。要做到真正安全通讯,需要我们手动去验证服务端返回的证书,AFSecurityPolicy封装了证书验证的过程,让用户可以轻易使用,除了去系统信任CA机构列表验
2、证,还支持SSL Pinning方式的验证。AFSecurityPolicy分三种验证模式:AFSSLPinningModeNone这个模式表示不做SSLpinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的。AFSSLPinningModeCertificate这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端
3、返回的是否一致。这里还没弄明白第一步的验证是怎么进行的,代码上跟去系统信任机构列表里验证一样调用了SecTrustEvaluate,只是这里的列表换成了客户端保存的那些证书列表。若要验证这个,是否应该把服务端证书的颁发机构根证书也放到客户端里?AFSSLPinningModePublicKey这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息。只要公钥是正确的,就能保证通信不会被窃听,因为中间人没有私钥,无法解开通过公钥加密的数据。详情请见代码:
4、[objc] viewplaincopy1.#import "AFSecurityPolicy.h" 2. 3.// Equivalent of macro in , without causing compiler warning: 4.// "'DebugAssert' is deprecated: first deprecated in OS X 10.8" 5.//这两个宏方法用于方便地处理调用各种证书方法过程中出现的错误,出现错误后用goto语句直接跳转到结束语
5、 6.//关于为什么要用 __builtin_expect (x, 0) 而不直接用 x != 0,是为了CPU执行时的性能优化,见这里: 7.//http://stackoverflow.com/questions/7346929/why-do-we-use-builtin-expect-when-a-straightforward-way-is-to-use-if-else 8.#ifndef AF_Require_noErr 9. #define AF_Require_noErr(er
6、rorCode, exceptionLabel) 10. do { 11. if (__builtin_expect(0 != (errorCode), 0)) { 12. goto excep
7、tionLabel; 13. } 14. } while (0) 1.#endif 2. 3.#if !defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 4.static NSData * AFSec
8、KeyGetData(SecKeyRef key) { 5. CFDataRef data = NULL; 6. 7. AF_Require_noErr(SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data), _out); 8. 9. return (__bridge_tr
此文档下载收益归作者所有