搜索
您的当前位置:首页正文

使用AFNetworking来支持HTTPS遇到的坑

来源:哗拓教育

-(AFSecurityPolicy*)customSecurityPolicy {

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];

    NSData *cerData = [NSData dataWithContentsOfFile:cerPath];

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    securityPolicy.allowInvalidCertificates = YES;

    securityPolicy.validatesDomainName=NO;

    securityPolicy.pinnedCertificates= [NSSetsetWithArray:@[cerData]];

    returnsecurityPolicy;

}

就这么几行代码就可以实现使用AFNetworking来支持HTTPS,但是潜在的问题也很严重。

注意就是这行个代码坑坏我们了AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

AFSecurityPolicy相关的配置

1> SSLPinningMode

typedefNS_ENUM(NSUInteger, AFSSLPinningMode) {    AFSSLPinningModeNone,    AFSSLPinningModePublicKey,    AFSSLPinningModeCertificate,};

AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书。

AFSSLPinningModePublicKey: 代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。

AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。

如果选了AFSSLPinningModeCertificate,那么服务器的证书过期了,导入你本地的证书也不能用了,当时只复制了人家的代码,没有好好看一下每行代码是干什么用的,这是很不好的习惯啊!!!!!

所以说如果你的APP对安全性的要求特别高,可以用AFSSLPinningModeCertificate,但是记得及时看看证书有没有过期,提前更新APP替换了证书就OK,就怕遇到苹果延迟审核的情况,到时候就麻烦了。我还是建议使用AFSSLPinningModePublicKey,这个只验证公钥部分就可以了,你导入本地的证书过期了也没关系,服务器的证书的公钥是不会变的。

Top