您的位置:首页 > 理论基础 > 计算机网络

App中HTTPS设置

2016-01-20 11:09 645 查看
为了安全方面的考虑,项目想改用HTTPS进行数据传输.目前项目所用的网络请求是AFN2.6版本的,默认不支持HTTPS网址进行数据请求,错误代码:

[code]2016-01-20 08:49:00.780 TestHttps[1494:30088] CFNetwork SSLHandshake failed (-9824)
2016-01-20 08:49:00.781 TestHttps[1494:30088] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
2016-01-20 08:49:00.782 TestHttps[1494:29950] error==Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7ff7f2c3d260 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://example.com/, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamPropertySSLClientCertificateState=0, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., _kCFStreamErrorDomainKey=3, NSErrorFailingURLKey=https://example.com/, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://example.com/, NSErrorFailingURLStringKey=https://example.com/, _kCFStreamErrorDomainKey=3}


根据网上资料进行修改:

在Info.plist添加字段App Transport Security Settings,设置为YES

一:第一种方法是在网络请求类中添加

[code]AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
policy.allowInvalidCertificates = YES;
policy.validatesDomainName = NO;
manager.securityPolicy = policy;


二:第二种方法是

(1)下载网站的证书导入工程

(2)新建类方法

[code]//自定义安全策略
+ (AFSecurityPolicy*)customSecurityPolicy
{
    // /先导入证书
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"cer"];//证书的路径
//    NSString * cerPath = [[NSBundle mainBundle]pathForResource:@"https" ofType:@"cer"];

//    NSLog(@"%@",cerPath);
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//    NSLog(@"%@",certData);
//    NSSet * certSet = [[NSSet alloc] initWithObjects:certData, nil];

    // 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;
}


(3)修改AFN源码,如图




这样就可以用https网址进行数据请求了.

后记:HTTPS协议还有SSL还很不清楚,计算机基础差,以后急需补充.

参考资料:

http://www.jianshu.com/p/20d5fb4cd76d

http://oncenote.com/2014/10/21/Security-1-HTTPS/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: