适配iOS 的东西iOS DeveloperiOS学习笔记

对于HTTP转HTTPS请求证书问题

2016-12-23  本文已影响398人  我是七月
奋斗的七月

2015年9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS9
iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输。
直接造成的情况就是App发请求的时候弹出网络无法连接。

----1----https证书请求校验

----2----info.plist设置

info.plist里面把

App Transport Security Settings

Allow Arbitrary Loads 设置为NO

----3----证书转化

----4----把证书导入项目-代码适配

#pragma mark -----适配Https证书
+ (AFSecurityPolicy *)customSecurityPolicy

{
    
    //先导入证书,找到证书的路径
    
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"YJHhttps" ofType:@"cer"];
    
    NSData *certData = [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 = NO;
    
    NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
    
    securityPolicy.pinnedCertificates = set;
    
    return securityPolicy;
    
}

//---使用这个属性AFSSLPinningModeCertificate
AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书。
AFSSLPinningModePublicKey: 代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。
AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。

上一篇 下一篇

猜你喜欢

热点阅读