iOS AFNetworking/NSURLConnection HTTPS認證

使用AFNetworking來支持HTTPS

+ (AFSecurityPolicy*)customSecurityPolicy
{
    // 先導入證書
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Robert Laurence.cer" ofType:nil];//證書的路徑
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    
    // AFSSLPinningModeCertificate 使用證書驗證模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    
    // allowInvalidCertificates 是否允許無效證書(也就是自建的證書)祟辟,默認為NO  如果是需要驗證自建證書医瘫,需要設置為YES
    securityPolicy.allowInvalidCertificates = YES;
  
    //validatesDomainName 是否需要驗證域名,默認為YES旧困;
    //假如證書的域名與你請求的域名不一致登下,需把該項設置為NO茫孔;如設成NO的話,即服務器使用其他可信任機構頒發(fā)的證書被芳,也可以建立連接缰贝,這個非常危險,建議打開畔濒。
    //置為NO剩晴,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名侵状。因為SSL證書上的域名是獨立的赞弥,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的趣兄;當然绽左,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的艇潭。
    //如置為NO拼窥,建議自己添加對應域名的校驗邏輯。
    securityPolicy.validatesDomainName = NO;
    
    securityPolicy.pinnedCertificates = @[certData];
    
    return securityPolicy;
}
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    // 加上這行代碼蹋凝,https ssl 驗證鲁纠。
    manager.securityPolicy = [self customSecurityPolicy];

    [manager GET:url parameters:params progress:^(NSProgress * downloadProgress) {
    } success:^(NSURLSessionDataTask * task, id  responseObject) ]{
    } failure:^(NSURLSessionDataTask * task, NSError * error) {
    }];

使用NSURLConnection支持HTTPS的實現

// 通過系統(tǒng)默認驗證流程來驗證證書
NSURL * httpsURL = [NSURL URLWithString:@"https://www.google.com"];
self.connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:httpsURL] delegate:self];
//回調
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    //1 獲取trust object
    SecTrustRef trust = challenge.protectionSpace.serverTrust; 
    SecTrustResultType result;
    //2 SecTrustEvaluate對trust進行驗證
    OSStatus status = SecTrustEvaluate(trust, &result);
    if(status == errSecSuccess &&(result == kSecTrustResultProceed ||  
    result == kSecTrustResultUnspecified)) {  
    //3 驗證成功,生成NSURLCredential憑證cred鳍寂,告知challenge的sender使用這個憑證來繼續(xù)連接   
    NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];      
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];    
    } 
    else
     {  
    //4 驗證失敗改含,取消這次驗證流程
    [challenge.sender cancelAuthenticationChallenge:challenge]; 
    }
}
// 自建證書
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"Robert Laurence.cer" ofType:nil]; //證書的路徑
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(cerData));
self.trustedCertificates = @[CFBridgingRelease(certificate)];
//回調
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    //1 獲取trust object
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    SecTrustResultType result;
    //注意:這里將之前導入的證書設置成下面驗證的Trust Object的anchor certificate
    SecTrustSetAnchorCertificates(trust, (__bridge CFArrayRef)self.trustedCertificates);
    //2 SecTrustEvaluate會查找前面SecTrustSetAnchorCertificates設置的證書或者系統(tǒng)默認提供的證書,對trust進行驗證
    OSStatus status = SecTrustEvaluate(trust, &result);
    if (status == errSecSuccess &&
        (result == kSecTrustResultProceed ||
        result == kSecTrustResultUnspecified)) {
         
        //3 驗證成功迄汛,生成NSURLCredential憑證cred捍壤,告知challenge的sender使用這個憑證來繼續(xù)連接
        NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
        [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
         
    } else {
        //4 驗證失敗,取消這次驗證流程
        [challenge.sender cancelAuthenticationChallenge:challenge];
  }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末鞍爱,一起剝皮案震驚了整個濱河市白群,隨后出現的幾起案子,更是在濱河造成了極大的恐慌硬霍,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笼裳,死亡現場離奇詭異唯卖,居然都是意外死亡,警方通過查閱死者的電腦和手機躬柬,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門拜轨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人允青,你說我怎么就攤上這事橄碾。” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵法牲,是天一觀的道長史汗。 經常有香客問我,道長拒垃,這世上最難降的妖魔是什么停撞? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮悼瓮,結果婚禮上戈毒,老公的妹妹穿的比我還像新娘。我一直安慰自己横堡,他們只是感情好埋市,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著命贴,像睡著了一般道宅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上套么,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天培己,我揣著相機與錄音,去河邊找鬼胚泌。 笑死省咨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的玷室。 我是一名探鬼主播零蓉,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穷缤!你這毒婦竟也來了敌蜂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤津肛,失蹤者是張志新(化名)和其女友劉穎章喉,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體身坐,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡秸脱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了部蛇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摊唇。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涯鲁,靈堂內的尸體忽然破棺而出巷查,到底是詐尸還是另有隱情有序,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布岛请,位于F島的核電站旭寿,受9級特大地震影響,放射性物質發(fā)生泄漏髓需。R本人自食惡果不足惜许师,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僚匆。 院中可真熱鬧微渠,春花似錦、人聲如沸咧擂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽松申。三九已至云芦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贸桶,已是汗流浹背舅逸。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留皇筛,地道東北人琉历。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像水醋,于是被迫代替她去往敵國和親旗笔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容