前言
有的没有配置证书只是简单设置了网络请求的security也成功了,这里介绍的方式是配置证书的,更安全更有保障度。
这里先介绍AFNetworking的基本配置以及相关证书。
一、配置证书
1、服务器端证书配置好后可以给客户端一个证书,后缀是.crt的,拿到手后转成.der或.cer格式
-
.crt转.der方法 >
openssl x509 -in Users/Jeffrey/ca.crt -out /Users/Jeffrey/ca.der -outform DER
-
.crt转.cer方法
openssl x509 -in /Users/Jeffrey/ca.crt -out /Users/Jeffrey/ca.cer -outform DER
2、直接终端生成对应的cer证书
这个方式会跳过服务器端给的证书一步,因为很多时候你们都不清楚到底要哪个证书,也不知道哪里会出现错误。
直接看命令:
Expecting: TRUSTED CERTIFICATE
这个方法亲测有效!
二、证书导入
直接拖进去,记住这步。否则会没有读取到证书文件。
tip.png
三、AFNetworking单向验证设置
由于网络库没有更新,所以这里使用的还是AFNetworking 2.6.0的相关配置,其实最近的也是一致的,配置的都是AFSecurityPolicy,是一致的。
+ (AFSecurityPolicy*)customSecurityPolicy
{
// 先导入证书 -- 这里要判断环境
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server_staging" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。;。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO;
if (!certData) {
return securityPolicy;
}
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
这里建议统一设置,否则每次请求再单独添加会比较繁琐。
_requestManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[KYConfig defaultConfig].serverHostURL];
NSMutableSet *contentTypes = [_requestManager.responseSerializer.acceptableContentTypes mutableCopy];
[contentTypes addObject:@"application/json"];
_requestManager.responseSerializer.acceptableContentTypes = [contentTypes copy];
_requestManager.securityPolicy = [KYHTTPManager customSecurityPolicy];
关于webView以及SDWebImage等后续篇章会继续介绍,敬请关注。
下一篇:
相关参考:
如果需要Demo请留言,会在后续版本中添加。