iOS網絡-NSURLSession/AFNetworking發送HTTPS網絡請求

HTTPS簡單說明:
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。
即HTTP下加入SSL層,HTTPS的安全基礎是SSL(安全套接字層),因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。
HTTPS:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。
HTTPS和HTTP的區別主要爲以下四點:
        https協議需要到ca申請證書,一般免費證書很少,需要交費。
       http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
        http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
        http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
簡單說明:
HTTPS的主要思想是在不安全的網絡上創建一安全信道,並可在使用適當的加密包和服務器證書可被驗證且可被信任時,對竊聽和中間人攻擊提供合理的保護。
HTTPS的信任繼承基於預先安裝在瀏覽器中的證書頒發機構(如VeriSign、Microsoft等)(意即“我信任證書頒發機構告訴我應該信任的”)。
因此,一個到某網站的HTTPS連接可被信任,如果服務器搭建自己的https 也就是說採用自認證的方式來建立https信道,這樣一般在客戶端是不被信任的。
所以我們一般在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續。
使用NSURLSession示例代碼:



-(void)session
{
    //1.確定請求路徑
    NSString *urlStr = @"https://kyfw.12306.cn/otn/";
    NSURL *url= [NSURL URLWithString:urlStr];
    //2.創建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.創建session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //5.解析數據
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    //4.執行task
    [dataTask resume];
}
#pragma mark - NSURLSessionDataDelegate
//只要請求的地址是HTTPS的, 就會調用這個代理方法
//challenge:質詢
//NSURLAuthenticationMethodServerTrust:服務器信任
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
    NSLog(@"%@",challenge.protectionSpace);

    if (![challenge.protectionSpace.authenticationMethod isEqualToString:@"NSURLAuthenticationMethodServerTrust"]) return;
    /*
     NSURLSessionAuthChallengeUseCredential 使用證書
     NSURLSessionAuthChallengePerformDefaultHandling  忽略證書 默認的做法
     NSURLSessionAuthChallengeCancelAuthenticationChallenge 取消請求,忽略證書
     NSURLSessionAuthChallengeRejectProtectionSpace 拒絕,忽略證書
     */

    NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}

如果是使用AFN框架,那麼我們不需要做任何額外的操作,AFN內部已經做了處理,示例代碼如下:

-(void)afn
{
    //1.確定請求路徑
    NSString *urlStr = @"https://kyfw.12306.cn/otn/";
    NSURL *url= [NSURL URLWithString:urlStr];
    //2.創建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.創建會話管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer  = [AFHTTPResponseSerializer serializer];

  //是否接受無效的證書
    manager.securityPolicy.allowInvalidCertificates= YES;
    //是否匹配域名
    manager.securityPolicy.validatesDomainName = NO;

   NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

        NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
    }];
    //4.執行任務
    [dataTask resume];
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章