网络加密HTTPS

HTTPS

  • 写在前面:在AFN框架里这些都是不用写的。。。已经封装好了
  • 一般没有加密的情况下,客户端发送请求给服务器,服务器返回数据给客户端,遭到黑客拦截数据就曝光了,就算是一般的加密也可以解密。那么应该怎么办才能保证安全呢?现在HTTPS还算是安全的。

HTTPS下是这么运作的:

  • 客户端发送请求给服务器,服务器会先响应它,把一个受保护区域(包含一个公钥)返回给客户端,服务器自己保留了一个私钥。
  • 然后客户端再发请求给服务器,会先把请求通过公钥加密之后再传给服务器,服务器拿到请求通过私钥解密。
  • 然后同样,把响应体通过私钥加密,传给客户端,客户端通过公钥解密得到数据。
  • 要是有黑客拦截到了客户端发送的请求,他没有私钥是无法解密的

  • 我们上网打开一些加密性好的网站比如网上银行,一般会要求你安装证书,这个证书就包含了公钥。如果不安装,那么是没法访问的。

  • 我们开发客户端,需要关心的是如何安装证书,就三句话。

流程解析

  • 我们先发送一个请求给一个https的网站,我们需要设置代理,用下面这个方法可以顺便设置代理
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    // 证书分为好几种:
    NSURLSessionDataTask *task =  [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    [task resume];
}
  • 但是点击屏幕发送请求之后我们没有得到打印数据,因为这个是https网站,只要我们没有安装它的证书,那就无法得到数据。
  • 如果请求的地址是https的就会调用这个代理方法
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
//    NSLog(@"didReceiveChallenge %@", challenge.protectionSpace);
    NSLog(@"%@", challenge.protectionSpace.authenticationMethod);
  • 这个代理方法中会得到一个询问challenge,这个询问就包含了之前提到的受保护区域protectionSpace
  • 通过打印得知这个受保护区域有个属性:NSURLAuthenticationMethodServerTrust,这是一个证书的属性,意思是这个证书是服务器信任的
  • 既然服务器已经发送了一个它所信任的证书给我们,那么我们也信任它就完事了。
  • 这个代理方法有个block回调方法completionHandler,要求传两个参数。作个判断,如果证书类型是服务器信任的,我们就在这个回调方法completionHandler里传入这两个参数
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
  • 第一个参数NSURLSessionAuthChallengeDisposition是如何对待这个证书,
NSURLSessionAuthChallengeUseCredential = 0,                     使用证书
NSURLSessionAuthChallengePerformDefaultHandling = 1,            忽略证书(默认的处理方式)
NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2,     忽略书证, 并取消这次请求
NSURLSessionAuthChallengeRejectProtectionSpace = 3,            忽略当前这一次, 下一次再询问
  • 第二个参数是指我们要用第一个参数的方式对待哪一个证书(其实就应该是服务器发给我们的,放在在询问的受保护区域里了)。我们需要创建证书。然后把两个参数放进去,大功告成
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

completionHandler(NSURLSessionAuthChallengeUseCredential , credential);
  • 这个时候再点击屏幕,就会得到网站的响应体二进制了

后话

  • 在AFN框架里,这些都不用做,已经封装好了。在AFURLSessionManager.m里实现了这个代理方法
  • 用session请求的话,需要上面这么做。其实就三步:1.设置代理实现代理方法。2.判断证书类型是否是服务器信任的3.如果是信任的,创建证书并且把证书和处理证书的方式一起传回去
  • 如果网站没有申请了权威机构认证的https证书(企业级每年3700多),那么每次发送请求,都要求进行重新获得授权。比如12306
  • 如果网站申请了权威机构的认证证书,那么客户端只要信任一次就可以了。(代理方法只调用一次)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值