AFNetworking3.x使用自簽名證書建立https連接

這是第一次在簡(jiǎn)書寫東西,也是第一次在網(wǎng)絡(luò)上寫這類文章,所以寫得不好的話,也請(qǐng)諒解下。

在網(wǎng)上找了許久,沒找到一個(gè)完整的關(guān)于afn設(shè)置自簽名證書進(jìn)行https鏈接的文章,也許是我搜索的方式不對(duì),好在現(xiàn)在實(shí)現(xiàn)了afn使用自簽名證書進(jìn)行https鏈接。

https://example.com/jianshu.php

配置前準(zhǔn)備

  • cer證書文件


    屏幕快照 2016-11-26 下午3.31.00.png
  • AFNetworking3

導(dǎo)入工程啥的也就不說了

下面開始干正經(jīng)事

  • 導(dǎo)入文件到項(xiàng)目
cer、afn導(dǎo)入工程
  • 為站點(diǎn)添加白名單
白名單
  • 添加主要代碼
-(void)postToWeb{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    // 安全驗(yàn)證
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    /*
     AFSSLPinningModeNone: 代表客戶端無條件地信任服務(wù)器端返回的證書。
     AFSSLPinningModePublicKey: 代表客戶端會(huì)將服務(wù)器端返回的證書與本地保存的證書中,PublicKey的部分進(jìn)行校驗(yàn);如果正確,才繼續(xù)進(jìn)行。
     AFSSLPinningModeCertificate: 代表客戶端會(huì)將服務(wù)器端返回的證書和本地保存的證書中的所有內(nèi)容,包括PublicKey和證書部分,全部進(jìn)行校驗(yàn);如果正確,才繼續(xù)進(jìn)行。
     */
    securityPolicy.allowInvalidCertificates = YES;//是否信任非法證書(自建證書)
    securityPolicy.validatesDomainName = NO;//是否驗(yàn)證域名有效性
    manager.securityPolicy = securityPolicy;
    NSDictionary *postDic = @{@"jianshu":@"1"};
    
    [manager POST:@"https://example.com/jianshu.php" parameters:postDic progress:^(NSProgress * _Nonnull uploadProgress) {
        
    }success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSString *resultStr = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"請(qǐng)求成功,%@",resultStr);
    }failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"請(qǐng)求失敗:%@",error);
    }];
}

工程一覽

工程

抓包查看

抓包結(jié)果

已經(jīng)加密訪問了web了

假設(shè)服務(wù)器與內(nèi)置證書不符

另一個(gè)cre證書文件

那么好像就請(qǐng)求失敗了

失敗

而如果將

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

換成

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];

AFSSLPinningModeNone: 代表客戶端無條件地信任服務(wù)器端返回的證書。
AFSSLPinningModePublicKey: 代表客戶端會(huì)將服務(wù)器端返回的證書與本地保存的證書中,PublicKey的部分進(jìn)行校驗(yàn);如果正確,才繼續(xù)進(jìn)行。
AFSSLPinningModeCertificate: 代表客戶端會(huì)將服務(wù)器端返回的證書和本地保存的證書中的所有內(nèi)容,包括PublicKey和證書部分,全部進(jìn)行校驗(yàn);如果正確,才繼續(xù)進(jìn)行。

那么返回的結(jié)果則

不校驗(yàn)證書的交互

11月29日,由于寫的時(shí)候想上傳demo的,后來忘了補(bǔ)充一點(diǎn):

注釋afn中的兩行代碼

以上是我的一些學(xué)習(xí)分享,做為自己的學(xué)習(xí)筆記

  來自一名ios初學(xué)者的文章

對(duì)于這篇https鏈接的理解是:與服務(wù)器進(jìn)行交互時(shí),用AFSSLPinningModeCertificate 驗(yàn)證了是我的服務(wù)器,然后使用https鏈接。 有出現(xiàn)中間人的話,那么必定是不正確的服務(wù)器證書,我的app驗(yàn)證不過 也就不能交互了吧。不知道我理解錯(cuò)了沒有

也還有一個(gè)疑問,不知道我這模擬虛假服務(wù)器的方式是否正確。

有哪里不對(duì),望糾正我的無知~ 感激

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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