使用自簽名證書配置AFNetworking(3.x)實現HTTPS請求

1.實現HTTPS請求 --- 單項驗證

針對于用AFNetworking實現https單向驗證,只需要服務端提供 server.p12
雙擊安裝
打開鑰匙
找到你剛安裝的證書,導出此證書,選擇文件格式為 .cer , 命名隨你(建議使用英文)


19BF395E-69C5-4455-AF6D-D65149D3EF27.png
 把生成的 server.cer 拖入你的項目中
 代碼(代碼未封裝):
 - (void)post:(NSString *)url withParameters:(id)parameters success:(void (^)(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject))success failure:(void (^)(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error))failure {
      AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
      securityPolicy.allowInvalidCertificates = YES;      //是否允許使用自簽名證書
      securityPolicy.validatesDomainName = NO;           //是否需要驗證域名

      self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:url]];
      self.manager.responseSerializer = [AFJSONResponseSerializer serializer];
      self.manager.securityPolicy = securityPolicy;

      self.manager.responseSerializer.acceptableContentTypes  = [NSSet setWithObjects:@"application/xml",@"text/html",@"text/xml",@"text/plain",@"application/json",nil];

      __weak typeof(self) weakSelf = self;
      [self.manager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *_credential) {
             /// 獲取服務器的trust object
             SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust];
            /// 導入自簽名證書
            #warning 注意將你的證書加入項目,并把下面名稱改為自己證書的名稱
            NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx.cer" ofType:@"cer"];
            NSData* caCert = [NSData dataWithContentsOfFile:cerPath];
            if (!caCert) {
                 NSLog(@" ===== .cer file is nil =====");
                return 0;
             }
            NSArray *cerArray = @[caCert];
            weakSelf.manager.securityPolicy.pinnedCertificates = [NSSet setWithArray:cerArray];
    
            SecCertificateRef caRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)caCert);
            NSCAssert(caRef != nil, @"caRef is nil");
    
            NSArray *caArray = @[(__bridge id)(caRef)];
            NSCAssert(caArray != nil, @"caArray is nil");
    
             /// 將讀取到的證書設置為serverTrust的根證書
            OSStatus status = SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)caArray);
            SecTrustSetAnchorCertificatesOnly(serverTrust,NO);
            NSCAssert(errSecSuccess == status, @"SecTrustSetAnchorCertificates failed");
    
            /// 選擇質詢認證的處理方式
            NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
           __autoreleasing NSURLCredential *credential = nil;
    
           /// NSURLAuthenticationMethodServerTrust質詢認證方式
           if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
        
                /// 基于客戶端的安全策略來決定是否信任該服務器,不信任則不響應質詢。
                if ([weakSelf.manager.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) {
                /// 創(chuàng)建質詢證書
                credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
                /// 確認質詢方式
                if (credential) {
                      disposition = NSURLSessionAuthChallengeUseCredential;
                 } else {
                      disposition = NSURLSessionAuthChallengePerformDefaultHandling;
                 }
        } else {
            //取消挑戰(zhàn)
            disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
        }
    } else {
        disposition = NSURLSessionAuthChallengePerformDefaultHandling;
    }
    
    return disposition;
}];

[self.manager POST:url parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
     NSLog(@"%@", responseObject);
  ) {
        success(task,responseObject);
    }

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
      if (failure) {
          failure(task,error);
      }
  }];
}

以上就是單項驗證的步驟和代碼.

2.實現HTTPS請求 --- 雙向驗證

針對于用AFNetworking實現https單向驗證,只需要服務端提供 server.p12 和 客服端所使用的client.p12
只需要安裝server.p12, 導出server.cer(同單向驗證)
拖入導出的server.cer 和 client.p12 到項目中

具體可以看下github上的demo: https://github.com/StephentTom/-AFNetworking-3.x-HTTPS-.git

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容