HTTPS

如果项目使用的是AF做的网络请求,那么代码不用改

  • 客户端向服务器发送网络请求,服务器收到之后,不会立马给你返回数据,因为没有安全协议
  • 服务器向客户端下发安全证书
  • 客户端拿到证书之后,要做一件事情,就是信任证书
  • 证书中包含了非常重要的东西,就是公钥,那么信任证书的过程就是保存公钥,把公钥保存在本机
  • 那么再次发送信息的时候,服务器就认为你是一个安全的客户端,那么服务器会建立一个安全通道
  • 那么下次数据传输,就是通过公钥加密之后来进行传输的
  • 服务器拿到通过公钥加密之后的通过私钥加密
  • 客户端拿到服务器私钥加密之后的数据之后,通过公钥解密

作为开发者?

  • 证书拿到手之后呢?选择信任还是不信任证书
  • 密码还是做一次加密比较好,虽然这个密码是公钥
  • 因为私钥在服务器上,那么私钥被泄露的可能性非常低
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #d12f1b}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ba2da2}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #008400}p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'PingFang SC'; color: #008400}p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #78492a}p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #008400; min-height: 21.0px}span.s1 {font-variant-ligatures: no-common-ligatures; color: #78492a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}span.s4 {font-variant-ligatures: no-common-ligatures; color: #000000}span.s5 {font-variant-ligatures: no-common-ligatures; color: #4f8187}span.s6 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #000000}span.s7 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s8 {font-variant-ligatures: no-common-ligatures; color: #1337ff}span.s9 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s10 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}span.s11 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}span.s12 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s13 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #d12f1b}

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 有的时候Https访问我们可以直接拿到数据
    // 因为有的公司财大气粗 哥们有钱 可以认证
    // 但是很多公司的Https访问你这样是拿不到数据的 需要自己手动去信任
    // 认证过的HTTPS访问是强制安装证书的
//    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//    }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    [task resume];
}

#pragma mark -- 协议

/**
 证书回调

 @param session session
 @param challenge 询问客户端是否信任来自服务器的证书
 属性:protectionSpace(受保护的空间)
 Auth-Scheme:NSURLAuthenticationMethosServerTrust 服务器返回的授权模式,要求信任我们的服务器证书
 @param completionHandler 成功的回调 通过这个代码块回调决定对我们证书的处理
 NSURLSessionAuthChallengeDisposition
 
      NSURLSessionAuthChallengeUseCredential 使用服务器发回证书(保存在challenge里面)
      NSURLSessionAuthChallengePerformDefaultHandling 默认处理方式 会忽略证书
      NSURLSessionAuthChallengeCancelAuthenticationChallenge    取消整个证书 忽略证书
      NSURLSessionAuthChallengeRejectProtectionSpace  本次拒绝 下次再试
 
 NSURLCredential 证书本身
 */
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
    NSLog(@"%s",__FUNCTION__);
    // 1.判断服务器的身份验证方法是否是服务器信任的证书
    NSLog(@"%@",challenge.protectionSpace.authenticationMethod);
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        NSLog(@"是服务器信任");
        // 2.获得证书
        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        // 3.对服务器的证书做出“处理”
        completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end```

- 发现已经可以拿到数据了

###那么如果我们的项目中没有使用系统的NSURLSession来自己写网络请求呢?
AFNetworking中已经帮我们做了,具体可以看AFNetworking源码中
AFHTTPSessionManager

你可能感兴趣的:(HTTPS)