關于HTTPS的那些事

iOS中集成HTTPS

證書是自簽名的HTTPS證書什燕,如果是CA認證的就不會有下面的事情了。項目組最后到阿里云去申請免費試用一年的HTTPS證書萍摊。下面的純屬是為了紀念曾經(jīng)折騰過的問題:

NSURLSession驗證HTTPS

首先要成為NSURLSession的代理
<pre>
NSString *urlString = @"https://xxxx";
NSURL *myUrl = [NSURL URLWithString:urlString];

NSMutableURLRequest *myRequest = [NSMutableURLRequest requestWithURL:myUrl cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSURLSessionDataTask *task = [session dataTaskWithRequest:myRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
[task resume];

</pre>
然后實現(xiàn)下面的代理方法
<pre>
/*

  • 代理方法 NSURLSessionDelegate
    */
  • (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {
    NSLog(@"證書認證開始..");
    //先導入證書
    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"你的證書名字" ofType:@"cer"]; //證書的路徑
    NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
    SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(cerData));
    NSArray * trustedCertificates = @[CFBridgingRelease(certificate)];
    //1)獲取trust object
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    SecTrustResultType result;
    //注意:這里將之前導入的證書設置成下面驗證的Trust Object的anchor certificate
    SecTrustSetAnchorCertificates(trust, (__bridge CFArrayRef)trustedCertificates);
    //2)SecTrustEvaluate會查找前面SecTrustSetAnchorCertificates設置的證書或者系統(tǒng)默認提供的證書,對trust進行驗證
    OSStatus status = SecTrustEvaluate(trust, &result);
    if (status == errSecSuccess &&
    (result == kSecTrustResultProceed ||
    result == kSecTrustResultUnspecified)) {
    NSLog(@"驗證成功..");
    //3)驗證成功,生成NSURLCredential憑證cred恳邀,告知challenge的sender使用這個憑證來繼續(xù)連接
    NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];completionHandler(NSURLSessionAuthChallengeUseCredential,cred);
    } else {
    NSLog(@"驗證失敗..");
    [challenge.sender cancelAuthenticationChallenge:challenge];
    }
    }
    </pre>

AFNetWorking

我們先封裝出來一個Post方法,設置AFN的setSecurityPolicy方法
<pre>
/**

  • pots方法
    */
  • (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
    {
    // 1.獲得請求管理者
    AFHTTPSessionManager *mgr = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:BaseUrl]];
    // 2.申明返回的結(jié)果是text/html類型

    mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

    // 加上這行代碼灶轰,https ssl 驗證谣沸。
    [mgr setSecurityPolicy:[self customSecurityPolicy]];

    // 3.發(fā)送POST請求
    [mgr POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * task, id responseObject) {
    if (success) {
    success(responseObject);
    }
    } failure:^(NSURLSessionDataTask * task, NSError * error) {
    if (failure) {
    failure(error);
    }
    }];
    }
    </pre>

自定義的customSecurityPolicy方法:
<pre>

  • (AFSecurityPolicy*)customSecurityPolicy
    {
    // /先導入證書
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:CertName ofType:@"cer"];//證書的路徑
    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;

    NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];

    securityPolicy.pinnedCertificates = set;

    return securityPolicy;
    }
    </pre>

完成咏删!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惹想,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子督函,更是在濱河造成了極大的恐慌嘀粱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辰狡,死亡現(xiàn)場離奇詭異锋叨,居然都是意外死亡,警方通過查閱死者的電腦和手機宛篇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門娃磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叫倍,你說我怎么就攤上這事偷卧。” “怎么了吆倦?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵涯冠,是天一觀的道長。 經(jīng)常有香客問我逼庞,道長蛇更,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任赛糟,我火速辦了婚禮派任,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘璧南。我一直安慰自己掌逛,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布司倚。 她就那樣靜靜地躺著豆混,像睡著了一般。 火紅的嫁衣襯著肌膚如雪动知。 梳的紋絲不亂的頭發(fā)上皿伺,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音盒粮,去河邊找鬼鸵鸥。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的妒穴。 我是一名探鬼主播宋税,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼讼油!你這毒婦竟也來了杰赛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤矮台,失蹤者是張志新(化名)和其女友劉穎乏屯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘿架,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瓶珊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耸彪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伞芹。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝉娜,靈堂內(nèi)的尸體忽然破棺而出唱较,到底是詐尸還是另有隱情,我是刑警寧澤召川,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布南缓,位于F島的核電站,受9級特大地震影響荧呐,放射性物質(zhì)發(fā)生泄漏汉形。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一倍阐、第九天 我趴在偏房一處隱蔽的房頂上張望概疆。 院中可真熱鬧,春花似錦峰搪、人聲如沸岔冀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽使套。三九已至,卻和暖如春鞠柄,著一層夾襖步出監(jiān)牢的瞬間侦高,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工春锋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矫膨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓期奔,卻偏偏與公主長得像侧馅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呐萌,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 這篇文章是我一邊學習證書驗證一邊記錄的內(nèi)容馁痴,稍微整理了下,共扯了三部分內(nèi)容: HTTPS 簡要原理肺孤;數(shù)字證書的內(nèi)容...
    左邊飛來一只狗閱讀 3,260評論 2 5
  • iOS安全系列之一:HTTPS 2014-10-21 如何打造一個安全的App罗晕?這是每一個移動開發(fā)者必須面對的問題...
    不作不會死閱讀 755評論 0 4
  • 原文地址:iOS安全系列之一:HTTPS 如何打造一個安全的App?這是每一個移動開發(fā)者必須面對的問題赠堵。在移動Ap...
    violafa閱讀 866評論 0 2
  • 一小渊、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信茫叭。所有信息明文傳播酬屉,帶來了三大風險。 (1)竊聽風險...
    XLsn0w閱讀 10,481評論 2 44
  • HTTPS其實HTTPS從最終的數(shù)據(jù)解析的角度揍愁,與HTTP沒有任何的區(qū)別呐萨,HTTPS就是將HTTP協(xié)議數(shù)據(jù)包放到S...
    七維樹閱讀 581評論 0 2