去年公司开始做https适配,在网上找的afn支持https的代码,直接复制进代码挺好用的,但是今年证书要过期了,正好我们的APP又遇到了2.1大礼包事件,迟迟不给我们上线,而且我们发现要想使用新证书我们必须修改我们本地的代码,各种坑啊。不说了,直接上原来的代码
-(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
SSLPinningMode 定义了https连接时,如何去校验服务器端给予的证书。
typedefNS_ENUM(NSUInteger, AFSSLPinningMode) { AFSSLPinningModeNone, AFSSLPinningModePublicKey, AFSSLPinningModeCertificate,};
AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书。
AFSSLPinningModePublicKey: 代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。
AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。
如果选了AFSSLPinningModeCertificate,那么服务器的证书过期了,导入你本地的证书也不能用了,当时只复制了人家的代码,没有好好看一下每行代码是干什么用的,这是很不好的习惯啊!!!!!
所以说如果你的APP对安全性的要求特别高,可以用AFSSLPinningModeCertificate,但是记得及时看看证书有没有过期,提前更新APP替换了证书就OK,就怕遇到苹果延迟审核的情况,到时候就麻烦了。我还是建议使用AFSSLPinningModePublicKey,这个只验证公钥部分就可以了,你导入本地的证书过期了也没关系,服务器的证书的公钥是不会变的。
网友评论
证书过期后续费,公钥会改变吧?