https的原理和逻辑就不写了,我自己也一知半解。
公司服务器用的是阿里云的,然后去找运维要了测试和正式环境的.pem文件,.crt文件也可以的。
图1.jpg
双击使用后可以在钥匙串中看到
图2.png
右键选择导出.cer文件,命名随意,我这里是只用不同环境的域名命名的,到时候使用方便。
然后将导出的.cer文件拖到项目中,记得查看Build Phases-> Copy Bundle Resources中有没有,如果没有记得添加一下,不然会用不了。
下面是代码
+ (AFHTTPSessionManager *)sessionManager {
//这里要使用initWithBaseURL来初始化,不然会报错,具体使用的时候会看到的
AFHTTPSessionManager *manager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:kOriginalURL]];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer.timeoutInterval = 15;
//获取应用版本号作为请求头的参数
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
appCurVersion = [appCurVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
//增加请求头信息
[manager.requestSerializer setValue:@"ios" forHTTPHeaderField:@"fromType"];
[manager.requestSerializer setValue:appCurVersion forHTTPHeaderField:@"appVersionCode"];
//证书
[manager setSecurityPolicy:[self customSecurityPolicy]];
return manager;
}
+ (AFSecurityPolicy *)customSecurityPolicy {
//导入证书数据
//kEnvironmentalKey为文件名,这里我写的是宏,做了不同环境的判定。例如测试是api.test.xxx.com
NSString *cerPath = [[NSBundle mainBundle] pathForResource:kEnvironmentalKey ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.pinnedCertificates = (id)@[cerData];
//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO;
return securityPolicy;
}
最后就正常使用就好!!!
写得比较糙,见谅见谅-_-
网友评论