English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Résumé : Au WWDC 2016la conférence des développeurs, Apple a annoncé une échéance : d'ici2017année1mois1le 26ème jour, toutes les applications sur l'App Store devront activer la fonctionnalité de sécurité de transport d'applications App Transport Security (ATS). App Transport Security (ATS) est une fonctionnalité de protection de la vie privée introduite par Apple dans iOS 9une fonctionnalité de protection de la vie privée introduite dans
le cadre utilisé dans le projet est AFNetworking 3.0 et versions supérieures, en raison de ATS, iOS ne permet d'utiliser que des liens commençant par Https, dans2016année12mois30 jour avant, Apple permettait de contourner ATS, comme le montre l'image suivante :
mais depuis2017année1mois1Le 18ème jour, Apple ne permettra plus d'utiliser des applications chargeant des ressources via http, donc cet article explique principalement comment utiliser AFN pour obtenir l'authentification des certificats de signature numérique (note : pour les certificats authentifiés par une autorité de certification CA, il n'est pas nécessaire de procéder à l'authentification, il suffit d'utiliser des liens commençant par Https pour accéder aux données et charger les pages). Le projet a été téléversé sur GitHub (pour consulter le code source, cliquez sur le lien) :HttpsSignatureCertificate_jb51.rar
1,créer une classe racine ici appelée AKNetPackegeAFN
1> .h fichier, créer les méthodes Get et Post nécessaires
#import <Foundation/Foundation.h> typedef enum{ AKNetWorkGET , /**< GET请求 */ AKNetWorkPOST = 1 /**< POST请求 */ }AKNetWorkType; typedef void (^HttpSuccess)(id json); typedef void (^HttpErro)(NSError* error); @interface AKNetPackegeAFN : NSObject +(instancetype)shareHttpManager; /* * netWorkType:Méthode de requête GET ou POST signature:Utiliser un certificat de signature, si oui, écrivez directement le nom du certificat, sinon remplissez nil api:Interface d'URL de la requête parameters:Paramètres de la requête sucess:Valeur de retour en cas de succès de la requête fail:Valeur de retour en cas d'échec de la requête * */ - (void)typeDeRéseau:(AKNetWorkType)typeDeRéseau Signature:(NSString *)signature API:(NSString *)paramètres API:(NSDictionary *)paramètres Success:(HttpSuccess)sucess Echec:(HttpErro)fail; @end
2> .m fichier, importez le fichier d'en-tête AFNetworking.h, créez une propriété Manager et implémentez la méthode shareHttpManager
#import "AKNetPackegeAFN.h" #import "AFNetworking.h" @interface AKNetPackegeAFN() @property (nonatomic,strong) AFHTTPSessionManager *manager; @end @implementation AKNetPackegeAFN +(instancetype)shareHttpManager{ static dispatch_once_t onece = 0; static AKNetPackegeAFN *httpManager = nil; dispatch_once(&onece, ^(void){ httpManager = [[self alloc]init]; }); return httpManager; }
2,implémentation des méthodes Get et Post
Lors de l'utilisation, convertissez le certificat fourni par l'arrière-plan en format .cer, glissez-le dans le répertoire racine du projet, et liez-le dans la méthode. Par exemple, le nom du certificat fourni par l'arrière-plan est : Kuture.crt. Double-cliquez sur le certificat reçu pour l'installer, puis ouvrtez le trousseau de clés, cliquez avec le bouton droit sur le certificat nommé Kuture, exportez-le avec l'extension .cer et cliquez sur Ok. Voici à quoi cela ressemble :
--> -->
-->
Encapsulation des méthodes GET et POST
- (void)typeDeRéseau:(AKNetWorkType)typeDeRéseau Signature:(NSString *)signature API:(NSString *)paramètres API:(NSDictionary *)paramètres Success:(HttpSuccess)sucess Echec:(HttpErro)fail{ //Activer le mode de vérification des certificats AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //Doit-on autoriser l'utilisation de certificats auto-signés? signature == nil ? (void)(securityPolicy.allowInvalidCertificates = NO):(securityPolicy.allowInvalidCertificates = YES); //Doit-on vérifier le nom de domaine? securityPolicy.validatesDomainName = NO; _manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:api]]; _manager.responseSerializer = [AFJSONResponseSerializer serializer]; _manager.securityPolicy = securityPolicy; _manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"application/xml",@"text/xml",@"text/json",@"text/plain",@"text/javascript",@"text/html", nil]; if (signature != nil){ __weak typeof(self) weakSelf = self; [_manager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *_credential) { //Obtenir l'objet de confiance du serveur SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust]; //Importation de certificat auto-signé NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Nom de ton certificat" ofType:@"cer"]; NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; if (!cerData) { NSLog(@"==== Le fichier .cer est nil ===="); return 0; } NSArray *cerArray = @[cerData]; weakSelf.manager.securityPolicy.pinnedCertificates = cerArray; SecCertificateRef caRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)cerData); NSCAssert(caRef != nil, @"caRef est nil"); NSArray *caArray = @[(__bridge id)(caRef)]; NSCAssert(caArray != nil, @"caArray est nil"); //Définir le certificat lu comme le certificat racine de serverTrust OSStatus status = SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)caArray); SecTrustSetAnchorCertificatesOnly(serverTrust, NO); NSCAssert(errSecSuccess == status, @"Échec de SectrustSetAnchorCertificates"); //Choisir la méthode de traitement de la vérification de challenge NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; __autoreleasing NSURLCredential *credential = nil; //Méthode de vérification d'authentification de trust de serveur NSURLAuthenTicationMethodServerTrust if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { //Décider de la confiance envers le serveur en fonction de la stratégie de sécurité client, ne pas répondre au défi si non confiance if ([weakSelf.manager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { //Créer un certificat de défi credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; //Confirmer le mode de défi if (credential) { disposition = NSURLSessionAuthChallengeUseCredential; } else { disposition = NSURLSessionAuthChallengePerformDefaultHandling; } } else { //Annuler le défi disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; } } else { disposition = NSURLSessionAuthChallengePerformDefaultHandling; } return disposition; }; } if (netWorkType == 0) { [_manager GET:api parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (sucess) { sucess(responseObject); else { NSLog(@"Exception de liaison ou réseau inexistant"); } }; failure:^(NSURLSessionDataTask * _Nullable tâche, NSError * _Nonnull error) { fail(error); }; } else if (netWorkType == 1){ [_manager POST:api parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (sucess) { sucess(responseObject); else { NSLog(@"Exception de liaison ou réseau inexistant"); } }; failure:^(NSURLSessionDataTask * _Nullable tâche, NSError * _Nonnull error) { fail(error); }; } }
2 Méthode d'utilisation, dans les classes nécessitant des données d'obtention ou de transmission, importez directement le fichier d'en-tête AKNetPackegeAFN.h et implémentez la méthode, comme indiqué ci-dessous :
//Création d'un objet //Si le certificat est auto-signé, avant d'utiliser, bind le certificat dans la méthode correspondante d'AKNetPackegeAFN (le certificat peut être glissé directement dans le projet) /* * netWorkType:Méthode de requête GET ou POST signature:Utiliser un certificat de signature, si oui, écrivez directement le nom du certificat, sinon remplissez nil api:Interface d'URL de la requête parameters:Paramètres de la requête sucess:Valeur de retour en cas de succès de la requête fail:Valeur de retour en cas d'échec de la requête * */ AKNetPackegeAFN *netHttps = [AKNetPackegeAFN shareHttpManager]; [netHttps netWorkType:Type de requête Signature:Nom du certificat API:URL de l'API Parameters:Paramètres Success:^(id json) { NSLog(@"Json:%@",json); }; Fail:^(NSError *error) { NSLog(@"Error:%@",error); };
Voici la totalité du contenu de cet article, j'espère qu'il vous sera utile dans vos études, et j'espère que vous soutenirez également le tutoriel d'alarme.
Déclaration : le contenu de cet article est issu du réseau, et appartient à l'auteur original. Le contenu est contribué et téléversé par les utilisateurs d'Internet de manière volontaire. Ce site ne détient pas de propriété intellectuelle, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu présumé violer les droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu présumé enfreindre les droits d'auteur.