iOS访问https ssl和tls双向加密

文章已经移到此处:http://www.henishuo.com/ios-https-tls-ssl/

关于https和ssl的原理,请到此处查看:http://blog.163.com/magicc_love/blog/static/185853662201321423527263/

由于项目需求,访问服务是https的,并且使用的是ssl加密方式

下面说明使用MKNetworkit网络库实现的代码:

- (void)testClientCertificate {
  SecIdentityRef identity = NULL;
  SecTrustRef trust = NULL;
  NSString *p12 = [[NSBundle mainBundle] pathForResource:@"testClient" ofType:@"p12"];
  NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];

  [[self class] extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data];

  NSString *url = @"https://218.244.131.231/ManicureShop/api/order/pay/%@";
  NSDictionary *dic = @{@"request" : @{
                            @"orderNo" : @"1409282102222110030643",
                            @"type" : @(2)
                            }
                        };

  _signString = nil;
  NSData *postData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
  NSString *sign = [self signWithSignKey:@"test" params:dic];
  NSMutableData *body = [postData mutableCopy];
  NSLog(@"%@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
  url = [NSString stringWithFormat:url, sign];

  MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"218.244.131.231"];
  MKNetworkOperation *op = [engine operationWithPath:[NSString stringWithFormat:@"/ManicureShop/api/order/pay/%@", sign] params:dic httpMethod:@"POST" ssl:YES];
  op.postDataEncoding = MKNKPostDataEncodingTypeJSON; // 传JOSN

  // 这个是app bundle 路径下的自签证书
  op.clientCertificate = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"testClient.p12"];
  // 这个是自签证书的密码
  op.clientCertificatePassword = @"testHttps";

  // 由于自签名的证书是需要忽略的,所以这里需要设置为YES,表示允许
  op.shouldContinueWithInvalidCertificate = YES;
  [op addCompletionHandler:^(MKNetworkOperation *completedOperation) {
    NSLog(@"%@", completedOperation.responseJSON);
  } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
    NSLog(@"%@", [error description]);
  }];

  [engine enqueueOperation:op];
  return;
}

// 下面这段代码是提取和校验证书的数据的

+ (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef*)outTrust fromPKCS12Data:(NSData *)inPKCS12Data {
  OSStatus securityError = errSecSuccess;

  // 证书密钥
  NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:@"testHttps"
                                                                forKey:(__bridge id)kSecImportExportPassphrase];

  CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
  securityError = SecPKCS12Import((__bridge CFDataRef)inPKCS12Data,(__bridge CFDictionaryRef)optionsDictionary,&items);

  if (securityError == 0) {
    CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
    const void *tempIdentity = NULL;
    tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);
    *outIdentity = (SecIdentityRef)tempIdentity;
    const void *tempTrust = NULL;
    tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
    *outTrust = (SecTrustRef)tempTrust;
  } else {
    NSLog(@"Failed with error code %d",(int)securityError);
    return NO;
  }
  return YES;
}

下面说明一下使用AFNetworking网络库访问的方式:

- (void)testClientCertificate {
  SecIdentityRef identity = NULL;
  SecTrustRef trust = NULL;
  NSString *p12 = [[NSBundle mainBundle] pathForResource:@"testClient" ofType:@"p12"];
  NSData *PKCS12Data = [NSData dataWithContentsOfFile:p12];

  [[self class] extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data];

  NSString *url = @"https://218.244.131.231/ManicureShop/api/order/pay/%@";
  NSDictionary *dic = @{@"request" : @{
                            @"orderNo" : @"1409282102222110030643",
                            @"type" : @(2)
                            }
                        };

  _signString = nil;
  NSData *postData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
  NSString *sign = [self signWithSignKey:@"test" params:dic];
  NSMutableData *body = [postData mutableCopy];
  NSLog(@"%@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
  url = [NSString stringWithFormat:url, sign];

  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  manager.requestSerializer = [AFJSONRequestSerializer serializer];
  manager.responseSerializer = [AFJSONResponseSerializer serializer];
  [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
  [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
  manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json", @"text/plain"]];
  manager.securityPolicy = [self customSecurityPolicy];

  [manager POST:url parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"Error: %@", error);
  }];
}

下面这段代码是处理SSL安全性问题的:

/**** SSL Pinning ****/
- (AFSecurityPolicy*)customSecurityPolicy {
  NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"testClient" ofType:@"cer"];
  NSData *certData = [NSData dataWithContentsOfFile:cerPath];
  AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];
  [securityPolicy setAllowInvalidCertificates:YES];
  [securityPolicy setPinnedCertificates:@[certData]];
  [securityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];
  /**** SSL Pinning ****/
  return securityPolicy;
}

为了实现访问https tls加密方式,我也费了不少时间来查,这里写下此文章,希望对大家有用!

时间: 2024-11-03 03:57:38

iOS访问https ssl和tls双向加密的相关文章

iis内网程序想用https访问,ssl证书怎么弄

问题描述 iis内网程序想用https访问,ssl证书怎么弄 程序部署在内网iis服务器上,与外网物理隔离,内网只能通过ip地址访问,没有dns服务器,怎么用h?ttps访问? 解决方案 https一样支持ip方式,自己制作一个对应IP地址的证书就可以了. 解决方案二: 免费StartSSL证书申请详细步骤和IIS中的SSL设置 http://www.server110.com/iis/201407/10798.html 解决方案三: 用hosts文件代替dns 解决方案四: 沃通(WoSign

系统管理员如何快速高效的部署SSL和TLS?

本文讲的是系统管理员如何快速高效的部署SSL和TLS?, SSL/TLS是一种简单易懂的技术,很容易部署,也很容易运行.不过存在主要的问题是加密不太容易部署,为了确保TLS提供必要的安全性,系统管理员和开发人员必须花费很大的精力来正确配置其服务器并开发相应的应用程序.所以,我们的目标就是帮助管理员和程序员减少在部署安全站点或Web应用程序上的巨大消耗. 1 私钥和证书 在TLS中,所有安全性都以服务器的加密身份开始,这就需要一个强大的私钥来防止攻击者进行模拟攻击.同样重要的是拥有一个有效和强大的

浅谈https\ssl\数字证书,互联网营销

在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议.http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层.从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容.

SSL&TLS 安全性测试

本文讲的是SSL&TLS 安全性测试,本文介绍了使用半自动化工具执行SSL&TLS安全性评估的过程,以及如何使用手动测试方法验证工具发现.目的是优化TLS和SSL安全测试流程,进行渗透测试时在TLS / SSL上花费更少的时间. 什么是TLS和SSL? 安全套接层(SSL)和传输层安全(TLS)加密用于通过互联网提供通信安全(传输加密)和互联网上的隐私来保护互联网和网络流量,用于诸如网络,电子邮件,即时消息(IM)和一些虚拟专用网(VPN). 因此,TLS安全配置很重要,应花时间学习和识别

ssl-tomcat6 http 能正常访问 https 报404错误

问题描述 tomcat6 http 能正常访问 https 报404错误 同url http能正常访问 https不能访问 报404错误 如:http://localhost/index.index 正常 https://localhost/index.html 为404 服务器环境:linux tomcat 6.0.36 jdk 1.6.0_37 64-Bit本机模拟配置一切正常.推断可能服务器环境存在问题,求大神指出server.xml<?xml version='1.0' encoding

php使用curl访问https示例分享

 curl是利用URL语法在命令行方式下工作的开源文件传输工具,下面介绍一下php使用curl访问https的示例,大家参考使用吧 为方便说明,先上代码吧   代码如下: /**   * curl POST   *   * @param   string  url   * @param   array   数据   * @param   int     请求超时时间   * @param   bool    HTTPS时是否进行严格认证   * @return  string   */   fu

【配置tomcat的https连接器】,访问https://localhost:8443,网页无法显示

问题描述 [配置tomcat的https连接器],访问https://localhost:8443,网页无法显示 1. 首先我使用命令keytool -genkey -alias tomcat -keyalg RSA生成我自己的数字签名,将生成的keystore文件拷贝到tomcat的conf目录下 2. 然后我在在server.xml中配置了 < Connector port="8443" protocol="HTTP/1.1" SSLEnabled=&qu

解决 Chrome 访问https网站出现“您的连接不是私密的问题”

解决chrome+goagent访问https网站出现"您的连接不是私密的问题" chrome 翻墙 goagent 最近的电脑出现了问题,于是重装了系统,重装系统之后速度明显好了许多.于是习惯性的安装chrome,目前安装的 是最新版本的chrome,可是目前在国内google服务被墙,不能登陆账号进行同步,于是果断的打开了goagent,一切顺利, 能够进行书签和应用,账号的同步,一切就像原来的一样.可是习惯性的打开youtube的时候,却显示"您的连接不是私密的&quo

Android or java https ssl exception

详细分析Android及Java中访问https请求exception(SSLHandshakeException, SSLPeerUnverifiedException)的原因及解决方法.1.现象 用Android(或Java)测试程序访问下面两个链接. https链接一:web服务器为jetty,后台语言为java. https链接二:web服务器为nginx,后台语言为php. 链接一能正常访问,访问链接二报异常,且用HttpURLConnection和apache的HttpClient两