AFNetworking 请求HTTPS时 SSL的身份验证设置

AFN如何验证SSL呢?

第一web端服务器必须要提供一个叫SSL的证书,证书里面包含有一个叫.crt的文件,你需要将它转换成.cer的格式,转换方法如下:

  openssl x509 -in your certificate.crt -out your certificate.cer -outform der

转换成功后需要找到你转换成.cer的文件.添加到你的xcode工程当中去;

我用的是AFN2.x 需要添加AFSecuriPolicy和setAFHTTPRequestOperationManager, 如下

- (AFSecurityPolicy*)SecurityPolicy

{

    NSString *cerPath = [[NSBundlemainBundlepathForResource:@"your certificate"ofType:@"cer"];

    NSData *certData = [NSDatadataWithContentsOfFile:cerPath];

    AFSecurityPolicy *securityPolicy = [[AFSecurityPolicyallocinit];

    [securityPolicy setAllowInvalidCertificates:YES];

    [securityPolicy setPinnedCertificates:@[certData]];

    [securityPolicy setSSLPinningMode:AFSSLPinningModePublicKey];

    return securityPolicy;

}    

管理器设置

   AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    [manager setSecurityPolicy:[selfSecurityPolicy]]; 

   manager.responseSerializer = [AFHTTPResponseSerializerserializer];

    [manager GET:@"your Url" parameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

        NSLog(@"成功了");

    } failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        NSLog(@"Error: %@", error);

    }];

    

}

 这样就可以了,你run一下 会打印出来的信息如下:

这说明请求还是失败的,那具体改如何解决呢? 需要你将下面的代码添加上就OK了!

securityPolicy.allowInvalidCertificates =NO;

    securityPolicy.validatesDomainName =YES;

    securityPolicy.validatesCertificateChain =NO;

 

allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO;

 

如果是需要验证自建证书,需要设置为YES

validatesDomainName 是否需要验证域名,默认为YES

假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。

置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立

validatesCertificateChain 是否验证整个证书链,默认为YES, 设置为YES,会将服务器返回的Trust Object上的证书链与本地导入的证书进行对比,达到验证的效果,(对于这具体不明白的可以百度)!

 

好了 现在你run一下就没问题了, 一切就OK 了!

如有说的不对的地方请指出(见谅)!



一天一章
原文地址:https://www.cnblogs.com/hangman/p/6876805.html