English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Zusammenfassung: Auf der WWDC 2016Apple-Entwicklerkonferenz, Apple hat eine Fristsetzung bekannt gegeben: bis2017Jahr1Monat1Tag müssen alle Anwendungen im App Store die Sicherheitsoption App Transport Security (ATS) aktivieren. App Transport Security (ATS) ist eine von Apple in iOS 9eine von Apple eingeführte Datenschutzfunktion, die das Laden von Klartext-HTTP-Ressourcen blockiert, die Verbindung muss über sicherere HTTPS hergestellt werden. Apple erlaubt Entwicklern derzeit, ATS vorübergehend zu deaktivieren und weiterhin HTTP-Verbindungen zu verwenden, aber bis zum Jahresende müssen alle offiziellen Store-Anwendungen ATS obligatorisch verwenden.
wird das Framework AFNetworking verwendet 3.0 und höheren Versionen, aufgrund von ATS, erlaubt iOS nur den Einsatz von HTTPS-Links, in2016Jahr12Monat30. Tag vor dem Monat, erlaubte Apple, ATS zu umgehen, wie im folgenden Bild gezeigt:
aber seit2017Jahr1Monat1ab dem Monat wird keine Anwendung mehr, die http-basierte Ressourcen lädt, akzeptiert, daher behandelt dieser Artikel hauptsächlich, wie man AFN verwendet, um eine Zertifikatsauthentifizierung durchzuführen (Anmerkung: Für Zertifikate, die durch CA-Zertifizierungsstellen überprüft werden, ist keine Authentifizierung erforderlich; man kann einfach HTTPS-Links verwenden, um auf Daten zuzugreifen und Seiten zu laden). Das Projekt wurde auf GitHub hochgeladen (falls Sie den Quellcode benötigen, klicken Sie auf den Link):HttpsSignatureCertificate_jb51.rar
1,创建一个根类,此处命名为AKNetPackegeAFN
1> .h-Datei, um die erforderlichen Get- und Post-Methoden zu erstellen
#import <Foundation/Foundation.h> typedef enum{ AKNetWorkGET , /**< GET-Anfrage */ AKNetWorkPOST = 1 /**< POST-Anfrage */ }AKNetWorkType; typedef void (^HttpSuccess)(id json); typedef void (^HttpErro)(NSError* error); @interface AKNetPackegeAFN : NSObject +(instancetype)shareHttpManager; /* * netWorkType:请求方式 GET 或 POST signature:是否使用签名证书,是的话直接写入证书名字,否的话填nil api:请求的URL接口 parameters:请求参数 sucess:请求成功时的返回值 fail:请求失败时的返回值 * */ - (void)netWorkType:(AKNetWorkType)netWorkType Signatur:(NSString *)Signatur API:(NSString *)API-Parameter:(NSDictionary *)Parameter Erfolg:(HttpSuccess)erfolg Fehl:(HttpErro)fehler; @end
2> .m-Datei, importieren Sie die Headerdatei AFNetworking.h, erstellen Sie das Manager-Attribut und implementieren Sie die shareHttpManager-Klassenmethode
#import "AKNetPackegeAFN.h" #import "AFNetworking.h" @interface AKNetPackegeAFN() @property (nonatomic,strong) AFHTTPSessionManager *manager; @end @implementation AKNetPackegeAFN +(instancetype)shareHttpManager{ static dispatch_once_t once = 0; static AKNetPackegeAFN *httpManager = nil; dispatch_once(&once, ^(void){ httpManager = [[self alloc]init]; }); return httpManager; }
2,Implementierung von Get und Post Methoden
Beim Verwenden konvertieren Sie das Zertifikat, das vom Hintergrund gegeben wurde, in das .cer-Format, ziehen Sie es in das Wurzelverzeichnis des Projekts, binden Sie es im Methodenaufruf, zum Beispiel: Der Name des vom Hintergrund gegebenen Zertifikats ist: Kuture.crt. Nach Erhalt des Zertifikats doppelklicken Sie darauf, um es zu installieren, öffnen Sie dann den Schlüsselschrank, klicken Sie mit der rechten Maustaste auf das Zertifikat mit dem Namen Kuture, wählen Sie die Dateiendung .cer und bestätigen Sie. Wie im folgenden Bild gezeigt:
--> -->
-->
Verpackung der GET- und POST-Implementierungsmethoden
- (void)netWorkType:(AKNetWorkType)netWorkType Signatur:(NSString *)Signatur API:(NSString *)API-Parameter:(NSDictionary *)Parameter Erfolg:(HttpSuccess)erfolg Fehl:(HttpErro)fehler{ //Aktivieren Sie den Zertifikatsverifizierungsmodus AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //是否允许使用自签名证书 signature == nil ? (void)(securityPolicy.allowInvalidCertificates = NO):(securityPolicy.allowInvalidCertificates = YES); //是否需要验证域名 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) { //获取服务器的信任对象 SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust]; //Importieren eines selbstsignierten Zertifikats NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"dein Zertifikatsname" ofType:@"cer"]; NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; if (!cerData) { NSLog(@"==== .cer Datei ist nil ===="); return 0; } NSArray *cerArray = @[cerData]; weakSelf.manager.securityPolicy.pinnedCertificates = cerArray; SecCertificateRef caRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)cerData); NSCAssert(caRef != nil, @"caRef ist nil"); NSArray *caArray = @[(__bridge id)(caRef)]; NSCAssert(caArray != nil, @"caArray ist nil"); //Setzen Sie das gelesene Zertifikat als Rootzertifikat von serverTrust OSStatus status = SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)caArray); SecTrustSetAnchorCertificatesOnly(serverTrust, NO); NSCAssert(errSecSuccess == status, @"SectrustSetAnchorCertificates failed"); //Wählen Sie die Verarbeitungsmethode der Herausforderungsauthentifizierung NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; __autoreleasing NSURLCredential *credential = nil; //NSURLAuthenTicationMethodServerTrust Herausforderungsauthentifizierungsmethode if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {}} //Bestimmen Sie basierend auf der Sicherheitsstrategie des Clients, ob Sie dem Server vertrauen, und reagieren Sie nicht auf die Herausforderung, wenn Sie nicht vertrauen if ([weakSelf.manager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { //Erstellen Sie das Herausforderungs-Zertifikat credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; //Bestätigen Sie den Herausforderungsmodus if (credential) { disposition = NSURLSessionAuthChallengeUseCredential; } else { disposition = NSURLSessionAuthChallengePerformDefaultHandling; } } else { //Abbrechen der Herausforderung 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(@"链接异常或网络不存在"); } }; failure:^(NSURLSessionDataTask * _Nullable task, 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(@"链接异常或网络不存在"); } }; failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { fail(error); }; } }
2 使用方法,在需要进行数据获取或传递的类里面,直接导入头文件AKNetPackegeAFN.h,并实现方法即可,如下所示:
//创建对象 //如果是自签名证书,使用前先到AKNetPackegeAFN相应的方法里进行证书的绑定(证书直接拖入项目中即可) /* * netWorkType:请求方式 GET 或 POST signature:是否使用签名证书,是的话直接写入证书名字,否的话填nil api:请求的URL接口 parameters:请求参数 sucess:请求成功时的返回值 fail:请求失败时的返回值 * */ AKNetPackegeAFN *netHttps = [AKNetPackegeAFN shareHttpManager]; [netHttps netWorkType:请求类型 Signature:证书名称 API:请求URL Parameters:参数 Success:^(id json) { NSLog(@"Json:%@",json); }; Fail:^(NSError *error) { NSLog(@"Error:%@",error); };
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有。内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发邮件时,请将#更换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)