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

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

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

https://example.com/jianshu.php

配置前準(zhǔn)備

  • cer證書文件


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

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

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

  • 導(dǎo)入文件到項目
cer、afn導(dǎo)入工程
  • 為站點添加白名單
白名單
  • 添加主要代碼
-(void)postToWeb{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    // 安全驗證
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    /*
     AFSSLPinningModeNone: 代表客戶端無條件地信任服務(wù)器端返回的證書。
     AFSSLPinningModePublicKey: 代表客戶端會將服務(wù)器端返回的證書與本地保存的證書中,PublicKey的部分進行校驗;如果正確,才繼續(xù)進行。
     AFSSLPinningModeCertificate: 代表客戶端會將服務(wù)器端返回的證書和本地保存的證書中的所有內(nèi)容,包括PublicKey和證書部分,全部進行校驗;如果正確,才繼續(xù)進行。
     */
    securityPolicy.allowInvalidCertificates = YES;//是否信任非法證書(自建證書)
    securityPolicy.validatesDomainName = NO;//是否驗證域名有效性
    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(@"請求成功,%@",resultStr);
    }failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"請求失敗:%@",error);
    }];
}

工程一覽

工程

抓包查看

抓包結(jié)果

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

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

另一個cre證書文件

那么好像就請求失敗了

失敗

而如果將

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

換成

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];

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

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

不校驗證書的交互

11月29日,由于寫的時候想上傳demo的,后來忘了補充一點:

注釋afn中的兩行代碼

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

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

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

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

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

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容