AFNetworking 中 设置 https的SSL认证
2016-02-24 11:33
751 查看
1.为什么要用SSL.一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探.其实这么做的话还是不够的 。 我们还需要防止中间人攻击(不明白的自己去百度)。攻击者通过伪造的ssl证书使app连接到了伪装的假冒的服务器上,这是个严重的问题!那么如何防止中间人攻击呢?首先web服务器必须提供一个ssl证书,需要一个 .crt 文件,然后设置app只能连接有效ssl证书的服务器。在开始写代码前,先要把
.crt 文件转成 .cer 文件,然后在加到xcode 里面.
2. .crt 文件转成 .cer 文件
2.1 使用openssl 进行转换
[objc] view
plain copy
print?
openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
2.2 通过安装crt文件,电脑导出
2.2.1 先打开“钥匙串访问”
2.2.2 选中你安装的crt文件证书,选择“文件”--》“导出项目”
2.2.3 选择.cer证书,存储即可。
3.AFNetworking 对数据进行https ssl加密.
实际上,很简单,只需要两步。
以下是我的代码:
[objc] view
plain copy
print?
- (AFSecurityPolicy*)customSecurityPolicy
{
// /先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"rx" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// 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 = NO;
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
//get请求
- (void)getString:(NSString *)string
{
NSString *str = [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
self.manager = [AFHTTPSessionManager manager];
_manager.responseSerializer = [AFHTTPResponseSerializer serializer];
_manager.securityPolicy = [self customSecurityPolicy];
[_manager GET:str parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
id dic = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
self.successfulBlock(dic);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
self.failBlock(error);
}];
}
可能遇到的问题
1)证书一定要拉到项目里面,AFN加了验证之后,看看获取证书的certData是否为空。如果为空,则证书有问题
[objc] view
plain copy
print?
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
2.如果https服务器没有数据返回,很大可能是因为服务器配置出了问题。
参考来源:http://cache.baiducontent.com/c?m=9d78d513d99015f30fabd1234d4f8c3a4c4380122ba6db0208de843e97732a40506692e161645245c4c50d2640f15e5d9ae74778207254a0edcc9f39dbafd56871877d72365e914061ce04ea8e0332c157c106b9f144b2fbe732e4ff8f8cc20c188b5407719db2965d0216c968f41026e3d1c30e4a01&p=8a79e71186cc42af5eacc7710f4181&newp=933ec90786cc42af5ef18f2d02148d231610db2151d6d60964&user=baidu&fm=sc&query=afnetworking+%C9%E8%D6%C3+https+ssl%C8%CF%D6%A4&qid=ba6bab8b0004848a&p1=1
.crt 文件转成 .cer 文件,然后在加到xcode 里面.
2. .crt 文件转成 .cer 文件
2.1 使用openssl 进行转换
[objc] view
plain copy
print?
openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
2.2 通过安装crt文件,电脑导出
2.2.1 先打开“钥匙串访问”
2.2.2 选中你安装的crt文件证书,选择“文件”--》“导出项目”
2.2.3 选择.cer证书,存储即可。
3.AFNetworking 对数据进行https ssl加密.
实际上,很简单,只需要两步。
以下是我的代码:
[objc] view
plain copy
print?
- (AFSecurityPolicy*)customSecurityPolicy
{
// /先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"rx" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// 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 = NO;
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy;
}
//get请求
- (void)getString:(NSString *)string
{
NSString *str = [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
self.manager = [AFHTTPSessionManager manager];
_manager.responseSerializer = [AFHTTPResponseSerializer serializer];
_manager.securityPolicy = [self customSecurityPolicy];
[_manager GET:str parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
id dic = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
self.successfulBlock(dic);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
self.failBlock(error);
}];
}
可能遇到的问题
1)证书一定要拉到项目里面,AFN加了验证之后,看看获取证书的certData是否为空。如果为空,则证书有问题
[objc] view
plain copy
print?
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
2.如果https服务器没有数据返回,很大可能是因为服务器配置出了问题。
参考来源:http://cache.baiducontent.com/c?m=9d78d513d99015f30fabd1234d4f8c3a4c4380122ba6db0208de843e97732a40506692e161645245c4c50d2640f15e5d9ae74778207254a0edcc9f39dbafd56871877d72365e914061ce04ea8e0332c157c106b9f144b2fbe732e4ff8f8cc20c188b5407719db2965d0216c968f41026e3d1c30e4a01&p=8a79e71186cc42af5eacc7710f4181&newp=933ec90786cc42af5ef18f2d02148d231610db2151d6d60964&user=baidu&fm=sc&query=afnetworking+%C9%E8%D6%C3+https+ssl%C8%CF%D6%A4&qid=ba6bab8b0004848a&p1=1
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS开发之路--微博“更多”页面
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- iOS推送的那些事
- IOS 改变键盘颜色代码
- 微信支付终于成功了(安卓、iOS)在此分享