防抓包(证书攻击)策略-iOS
2018-10-22 本文已影响39人
程序员不务正业
1、客户端进行判断是否设置了代理(对测试人员不友好)
+ (BOOL)getProxyStatus {
NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);
NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.google.com"], (CFDictionaryRef)proxySettings) autorelease]);
NSDictionary *settings = [proxies objectAtIndex:0];
NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
{
//没有设置代理
return NO;
}
else
{
//设置代理了
return YES;
}
}
2、客户端本地做证书校验,并且设置不仅仅校验公钥,设置完整的正式校验模式
2.1把证书机构签完的公钥证书放到工程里名称为"server.cer"
2.2设置AFSSLPinningMode
typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
AFSSLPinningModeNone,//(默认级别),客户端无条件信任任何下发的公钥证书
AFSSLPinningModePublicKey,//客户端本地去验证服务端下发的公钥证书的 public keys部分。如果正确才通过
AFSSLPinningModeCertificate,//客户端本地去验证服务端下发的公钥证书的所有部分。如果正确才通过
};
使用AFSSLPinningModePublicKey和AFSSLPinningModeCertificate方法基本可以防止青花瓷等的证书攻击
+(AFSecurityPolicy*)customSecurityPolicy
{
// /先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用证书验证模式 (AFSSLPinningModeCertificate是证书所有字段都一样才通过认证,AFSSLPinningModePublicKey只认证公钥那一段,AFSSLPinningModeCertificate更安全。但是单向认证不能防止“中间人攻击”)
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = YES;
NSSet<NSData*> * set = [[NSSet alloc]initWithObjects:certData , nil];
securityPolicy.pinnedCertificates = set;
return securityPolicy;
}
!bug
所有方法都是有漏洞的,iOS的app够安全,但是圈内依然有一群逆向工程师
方法1中在使用Class-Dump还是能够找到方法并且运行时替换或者直接hook方法进行修改返回逻辑,动态库注入方式,再使用企业签名把ipa包进行重新签名ios-app-signer,fir发布。
方法2中在逆向工程师眼里也是很简单破解的,app砸壳,再显示包内容,依然可以直接把你证书放在青花瓷中使用。
只是提高了破解难度,有树叶遮羞总比裸露在外面好一点