AFNetworking 添加证书校验 实现单向认证 防止第三方嗅探数据
刚刚领导要求客户端对https进行校验,防止中间人嗅探分析数据。考量了下,进行单向认证节省时间,也不需要服务器那边进行任何配置。毕竟只让我们自己动手的,不麻烦别人是最快的。那何为单向认证呢?其实就是客户端对服务器的证书和域名进行校验。
首先,后台那边会给你一个HTTPS的证书,格式是.cer的,如果是其他格式,自己转换成.cer格式。拖到自己的项目里面。项目的请求框架用的是AFNetworking,另外说下,AFHTTPSessionManager 这个管理类对象需要自己写成单例的方式,不然会内存泄漏。虽然他的初始化方法没有init和new。(我这应该是废话,毕竟能看到这篇文章的,都应该不是小白了)。我们改造下 AFHTTPSessionManager 的单例初始化方法。
dispatch_once(&once, ^{
//如果是带证书校验的,AFHTTPSessionManager 的初始化方法一定要带上根域名 例如https://www.baidu.com
_maneger = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:BaseURL]];
_maneger.requestSerializer.timeoutInterval = 20.0f;//请求等待时间
((AFJSONResponseSerializer *)_maneger.responseSerializer).removesKeysWithNullValues = YES;//移除nill类型字符串
_maneger.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json",@"text/plain",@"text/javascript",@"multipart/form-data", nil];//可接受文件类型
/*配置https证书*/
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"你的证书名字" ofType:@"cer"];//获取证书路径
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];//转成二进制数据
NSSet *dataSet = [[NSSet alloc] initWithObjects:cerData, nil];//可添加多个证书,我这边只有一个,仅添加一个
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:dataSet];//AFNetworking中管理证书的一个类
[securityPolicy setPinnedCertificates:dataSet];//设置证书文件
[securityPolicy setAllowInvalidCertificates:NO];//是否允许无效证书
[securityPolicy setValidatesDomainName:YES];//是否允验证域名
_maneger.securityPolicy = securityPolicy;
AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager manager];
[netManager startMonitoring];
[netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status == AFNetworkReachabilityStatusNotReachable) {
//无网络
}else if (status == AFNetworkReachabilityStatusReachableViaWWAN){
//移动网络
}else if (status == AFNetworkReachabilityStatusReachableViaWiFi){
//wifi
}else if (status == AFNetworkReachabilityStatusUnknown){
//未知网络
}
}];
});