iOS客户端ssl签名认证加密双向加密建议使用双向加密更好维护--修改

一个app是否做到强大的加密方式,需要一个好的后台支撑,我有幸我们公司后台哥是珍爱网出来的大神,第一次知道用到除了以前md5 base64 等等单向加密还有ssl认证加密,一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探,其实但心的黑客用伪造的ssl认证链接伪造的服务器上。

1.话不多说,首先你得要你后台给提供他的证书

2.拖到你的项目管理里面,这是你要做的,记住的项目是.cer结尾的证书。

3.我用到的是AFNetwrking这个框架。如果你自己用NSURLSession一样。

4.贴上代码

[objc] view
plain
 copy

  1. #import "MyDataService.h"
  2. #import "AFNetworking.h"
  3. #define BASE_URL @"xxxxxxxxx/"
  4. /**
  5. *  是否开启https SSL 验证
  6. *
  7. *  @return YES为开启,NO为关闭
  8. */
  9. #define LXPopenHttpsSSL YES
  10. /**
  11. *  SSL 证书名称,仅支持cer格式。
  12. */
  13. #define LXPcertificate @"mykey"
  14. //1.开发阶段: 测试服务器 -->ip --->
  15. //2.上线  :  生产服务器 -->ip  -->
  16. @implementation MyDataService
  17. + (NSURLSessionDataTask *)requestURL:(NSString *)urlstring
  18. httpMethod:(NSString *)method
  19. params:(NSDictionary *)params
  20. completion:(void(^)(id result,NSError *error))block {
  21. //1.拼接URL
  22. NSString *url = [BASE_URL stringByAppendingString:urlstring];
  23. #pragma mark - 设备唯一标识
  24. NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];
  25. #pragma mark - 设备信号
  26. NSString * strModel  = [UIDevice currentDevice].model;
  27. NSLog(@"%@",identifierForVendor);
  28. NSLog(@"%@",strModel);
  29. //3.创建AFHTTPSessionManager对象
  30. AFHTTPSessionManager *af = [AFHTTPSessionManager manager];
  31. NSString *userId1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"user_id"];
  32. NSString *token = [LXPTokenManager accessToken];
  33. NSInteger aa =[userId1 integerValue];
  34. NSLog(@"%@",userId1);
  35. //设置请求头
  36. if ([urlstring isEqualToString:@"noauth/loginUser.do"]||[urlstring isEqualToString:@"noauth/getProvideTypeList.do"]||[urlstring isEqualToString:@"noauth/addUser.do"]) {
  37. [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];
  38. [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];
  39. [af.requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];
  40. [af.requestSerializer setValue:@"iOS" forHTTPHeaderField:@"client"];
  41. }else{
  42. [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"identify"];
  43. [af.requestSerializer setValue:identifierForVendor forHTTPHeaderField:@"deviceid"];
  44. [af.requestSerializer setValue:@"1" forHTTPHeaderField:@"appId"];
  45. [af.requestSerializer setValue:@"iOS"forHTTPHeaderField:@"client"];
  46. NSLog(@"%@",userId1);
  47. [af.requestSerializer setValue:[NSString stringWithFormat:@"%@",userId1] forHTTPHeaderField:@"userId"];
  48. [af.requestSerializer setValue:token forHTTPHeaderField:@"token"];
  49. }
  50. af.requestSerializer.timeoutInterval = 10;
  51. //设置请求参数的数据格式:JSON   默认:&拼接
  52. //    af.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:<#(NSJSONWritingOptions)#>];
  53. //设置服务器返回的数据,不做解析,默认:使用JSON解析
  54. af.responseSerializer = [AFHTTPResponseSerializer serializer];
  55. // 加上这行代码,https ssl 验证。
  56. if(LXPopenHttpsSSL)
  57. {
  58. [af setSecurityPolicy:[self customSecurityPolicy]];
  59. }
  60. af.securityPolicy = [selfcustomSecurityPolicy];

    此处改成这样

  61. NSURLSessionDataTask *task = nil;
  62. //4.判断请求方式
  63. if ([method caseInsensitiveCompare:@"GET"] == NSOrderedSame) {
  64. //发送GET请求
  65. task = [af GET:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
  66. block(responseObject,nil);
  67. NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
  68. NSLog(@"string _____________%@", string);
  69. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  70. block(nil,error);
  71. }];
  72. }
  73. else if([method caseInsensitiveCompare:@"POST"] == NSOrderedSame) {
  74. //发送POST请求
  75. task = [af POST:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
  76. block(responseObject,nil);
  77. //            NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
  78. //            NSLog(@"string _____________%@", string);
  79. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  80. block(nil,error);
  81. }];
  82. }
  83. return task;
  84. }
  85. + (AFSecurityPolicy*)customSecurityPolicy
  86. {
  87. // /先导入证书
  88. NSString *cerPath = [[NSBundle mainBundle] pathForResource:LXPcertificate ofType:@"cer"];//证书的路径
  89. NSData *certData = [NSData dataWithContentsOfFile:cerPath];
  90. NSLog(@"====%@",certData);
  91. NSString *string;
  92. string = [[NSString alloc] initWithData:certData   encoding:NSUTF8StringEncoding];
  93. NSLog(@"数据%@",string);
  94. //    NSData *data1 = [string dataUsingEncoding:NSUTF8StringEncoding];
  95. //    NSError *e;
  96. //    NSDictionary *dic2 = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:&e];
  97. //    NSLog(@"=============>%@",dic2);
  98. //
  99. // AFSSLPinningModeCertificate 使用证书验证模式
  100. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
     //此处要改
  101. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy
    defaultPolicy];

    ;改成这样

  102. // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
  103. // 如果是需要验证自建证书,需要设置为YES
  104. securityPolicy.allowInvalidCertificates = YES;
  105. //validatesDomainName 是否需要验证域名,默认为YES;
  106. //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
  107. //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
  108. //如置为NO,建议自己添加对应域名的校验逻辑。
  109. securityPolicy.validatesDomainName = NO;
  110. securityPolicy.pinnedCertificates = @[certData];
  111. return securityPolicy;
  112. }

接下来,我们通过Charles抓取数据,抓到的数据已经加密。

时间: 2024-08-10 21:08:21

iOS客户端ssl签名认证加密双向加密建议使用双向加密更好维护--修改的相关文章

统一iOS客户端和服务器端认证

最近公司的同事业余时间搞了一个内部的类about.me(https://about.me/)的网站Ocelots,想来是一个很洋气的注意,以后跟客户介绍公司的时候,直接登录该网站,谈到谁的时候,就打开该人的主页,照片,经验,爱好等等什么的都一清二楚了.我就开始想,如果是这样的一个工具,没有移动端多遗憾,因为我们在任何时候,任何场合都有需求要给客户展示一下团队成员. 搭建好项目框架之后,遇到的第一个需求就是统一认证, Ocelots使用了Google Oauth2和Mozilla Persona作

iOS客户端学习之AES加密

数据加密在解密在软件开发过程中举足轻重的作用,可能有的公司在加密的时候有自己公司内部一套设计的算法,而在这方面不想浪费太大精力就可以去考虑使用第三方提供的加密算法,如AES加密算法,本篇内容介绍开源中国iOS客户端使用ASE算法加密密码: AES   GitHub 下载地址  https://github.com/Gurpartap/AESCrypt-ObjC 对一个比较大的工程我们可能都不知道某个类库或者方法在哪被使用,但是智能的Xcode给我们提供了一个全局搜索的功能,我们可以在真个工程中来

iOS客户端学习 AES加密和解密

数据加密在解密在软件开发过程中举足轻重的作用,可能有的公司在加密的时候有自己公司内部一套设计的算法,而在这方面不想浪费太大精力就可以去考虑使用第三方提供的加密算法,如AES加密算法,本篇内容介绍开源中国iOS客户端使用ASE算法加密密码: AES   GitHub 下载地址  https://github.com/Gurpartap/AESCrypt-ObjC 对一个比较大的工程我们可能都不知道某个类库或者方法在哪被使用,但是智能的Xcode给我们提供了一个全局搜索的功能,我们可以在真个工程中来

SSL双向认证和SSL单向认证的流程和区别

refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tencent.com/developer/news/233610 SSL/TLS 双向认证(一) -- SSL/TLS工作原理https://blog.csdn.net/wuliganggang/article/details/78428866 双向认证 SSL 协议要求服务器和用户双方都有证书.单向认证

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,服务器也会返回数据,服务器是用Java开发的,客户端要同时支持多平台(Android.iOS),在处理iOS的数据加密的时候遇到了一些问题.起初采取的方案是DES加密,老大说DES加密是对称的,网络抓包加上反编译可能会被破解,故采取RSA方式加密.RSA加密时需要公钥和私钥,客户端保存公钥加密数据,服务器保存私钥解密数据.(iOS端公钥加密私钥解密.java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不

基于Doubango的iOS客户端开源框架

一.ios-ngn-statck工程 1.Tests ---功能测试 2.底层模块(c和c++) Doubango --- 基于3GPP IMS/RCS 并能用于嵌入式和桌面系统的开源框架 1) tinyWRAP --- c++代码,对c代码以面向面向对象的方式进行封装,提供给上层调用. 2) tinyDAV --- Doubango媒体音频/视频控制,tinyMedia核心框架 a) audio --- 音频 b) codecs --- 编解码器 c) msrp --- 文件传输 d)vide

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

我的Android进阶之旅------&gt;Android采用AES+RSA的加密机制对http请求进行加密

前言 未加密的抓包截图 加密之后的抓包截图 基本需求及概念 AES算法 AES基本原理及算法流程 AES算法流程 RSA算法 RSA算法基本原理及流程 RSA算法实现流程 AES与RSA相结合数据加密方案 Android端 AESRSA结合实践 基本要求 基本流程 Android端 服务器端 java版示例 更多参考 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fidd

api接口对于客户端的身份认证方式以及安全措施

转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key