美文网首页
https配置及原理

https配置及原理

作者: 寂寞先森666 | 来源:发表于2019-08-29 10:38 被阅读0次

    如何配置?

    第一步、需要证书 xxx.cer(让服务端提供给你、或者从浏览器中获取)


    屏幕快照 2019-08-29 上午10.28.09.png QQ20190829-102354@2x.png QQ20190829-102844@2x.png

    第二部、导入工程中


    屏幕快照 2019-08-29 上午10.30.48.png

    第三部、配置AFN
    创建一个类NetManager(继承于AFHTTPSessionManager)

    #import <Foundation/Foundation.h>
    #import "AFNetworking/AFNetworking.h"
    
    @interface NetManager : AFHTTPSessionManager
    + (instancetype)share;
    @end
    
    #import "NetManager.h"
    @implementation NetManager
    + (instancetype)share{
        
        static NetManager *manager;
        
        static dispatch_once_t onceToken;
        
        dispatch_once(&onceToken, ^{
            
            NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
            
             manager = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.jianshu.com"] sessionConfiguration:configuration];
            
            [manager setSecurityPolicy:[self customSecurityPolicy]];
            
            manager.requestSerializer = [AFHTTPRequestSerializer serializer];
            
            manager.responseSerializer = [AFHTTPResponseSerializer serializer];
            
            });
        
           return manager;
        
    }
    + (AFSecurityPolicy *)customSecurityPolicy {
        
            // 先导入证书 证书由服务端生成,具体由服务端人员操作
            NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"*.jianshu.com" ofType:@"cer"];//证书的路径 xx.cer
        
            NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
        
            // AFSSLPinningModeCertificate 使用证书验证模式
            AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        
        
            // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO,如果是需要验证自建证书,需要设置为YES
            securityPolicy.allowInvalidCertificates = YES;
        
            
        
            //validatesDomainName 是否需要验证域名,默认为YES;
        
            //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
        
            //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
        
            //如置为NO,建议自己添加对应域名的校验逻辑。
        
            securityPolicy.validatesDomainName = YES;
        
            securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil];
        
            return securityPolicy;
        
    }
    @end
    

    在VC中使用

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self afNetWorkingRequest];
    }
    
    -(void)afNetWorkingRequest{
        
            NetManager * manager = [NetManager share];
        
            [manager GET:@"https://www.jianshu.com/p/fa65eb0460dc" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
                    NSLog(@"成功");
                    NSString *respons = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
                    NSLog(@"respons:%@",respons);
                } failure:^(NSURLSessionDataTask *task, NSError *error) {
                    NSLog(@"失败");
            }];
        
    }
    

    原理

    一、HTTPS和HTTP的区别

    HTTPS协议 = HTTP协议 + SSL/TLS协议

    SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。TLS的全称是Transport Layer Security,即安全传输层协议。

    即HTTPS是安全的HTTP。

    二、HTTPS的连接建立流程

    HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。在传输的过程中会涉及到三个密钥:

    服务器端的公钥和私钥,用来进行非对称加密

    客户端生成的随机密钥,用来进行对称加密

    image

    如上图,HTTPS连接过程大致可分为八步:

    1、客户端访问HTTPS连接。

    客户端会把安全协议版本号、客户端支持的加密算法列表、随机数C发给服务端。

    2、服务端发送证书给客户端

    服务端接收密钥算法配件后,会和自己支持的加密算法列表进行比对,如果不符合,则断开连接。否则,服务端会在该算法列表中,选择一种对称算法(如AES)、一种公钥算法(如具有特定秘钥长度的RSA)和一种MAC算法发给客户端。

    服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。

    在发送加密算法的同时还会把数字证书和随机数S发送给客户端

    3、客户端验证server证书

    会对server公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。

    4、客户端组装会话秘钥

    如果公钥合格,那么客户端会用服务器公钥来生成一个前主秘钥(Pre-Master Secret,PMS),并通过该前主秘钥和随机数C、S来组装成会话秘钥

    5、客户端将前主秘钥加密发送给服务端

    是通过服务端的公钥来对前主秘钥进行非对称加密,发送给服务端

    6、服务端通过私钥解密得到前主秘钥

    服务端接收到加密信息后,用私钥解密得到主秘钥。

    7、服务端组装会话秘钥

    服务端通过前主秘钥和随机数C、S来组装会话秘钥。

    至此,服务端和客户端都已经知道了用于此次会话的主秘钥。

    8、数据传输

    客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。

    同理,服务端收到客户端发送来的密文,用服务端密钥对其进行对称解密,得到客户端发送的数据。

    总结:

    会话秘钥 = random S + random C + 前主秘钥

    HTTPS连接建立过程使用非对称加密,而非对称加密是很耗时的一种加密方式

    后续通信过程使用对称加密,减少耗时所带来的性能损耗

    其中,对称加密加密的是实际的数据,非对称加密加密的是对称加密所需要的客户端的密钥。

    三、对称加密和非对称加密

    1、对称加密

    用同一套密钥来进行加密解密。

    对称加密通常有 DES,IDEA,3DES 加密算法。

    2、非对称加密

    用公钥和私钥来加解密的算法。

    公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分,私钥通常是保存在本地。

    用公钥进行加密,就要用私钥进行解密;反之,用私钥加密,就要用公钥进行解密(数字签名)。

    由于私钥是保存在本地的,所以非对称加密相对与对称加密是安全的。

    但非对称加密比对称加密耗时(100倍以上),所以通常要结合对称加密来使用。

    常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

    而为了确保客户端能够确认公钥就是想要访问的网站的公钥,引入了数字证书的概念,由于证书存在一级一级的签发过程,所以就出现了证书链,在证书链中的顶端的就是根CA。

    相关文章

      网友评论

          本文标题:https配置及原理

          本文链接:https://www.haomeiwen.com/subject/naibectx.html