iOS開發(fā):對于AFNetworking HTTP轉(zhuǎn)HTTPS請求證書問題

公司之前的請求都是HTTP的,現(xiàn)在要把HTTP改成HTTPS,如果我們只是單單的把http改成https,在進(jìn)行網(wǎng)絡(luò)請求的時候,會報(bào)下面的一大堆錯誤,大概意思也就是說證書無效,影響請求的安全性:


Domain=NSURLErrorDomain Code=-1202 "此服務(wù)器的證書無效。您可能正在連接到一個偽裝成“m.dks.com”的服務(wù)器,這會威脅到您的機(jī)密信息的安全。" UserInfo=0x1741abb40 {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x1740cdd60>, NSLocalizedRecoverySuggestion=您仍要連接此服務(wù)器嗎?, _kCFStreamErrorCodeKey=-9813, NSUnderlyingError=0x1740520f0 "未能完成操作。(“kCFErrorDomainCFNetwork”錯誤 -1202。)", NSLocalizedDescription=此服務(wù)器的證書無效。您可能正在連接到一個偽裝成“m.dks.com”的服務(wù)器,這會威脅到您的機(jī)密信息的安全。, NSErrorFailingURLKey=https://m.dks.com//user/login!login.do, NSErrorFailingURLStringKey=https://m.dks.com//user/login!login.do, _kCFStreamErrorDomainKey=3}


我們要做的就是,從后臺那里拿到一個.crt后綴的證書文件,把這個文件變成.cer后綴的文件,我此處使用的是命令行;當(dāng)然你也可以使用Mac上面的鑰匙串去訪問,讓后從政府頒發(fā)機(jī)構(gòu)導(dǎo)出.cer的文件;打開你的終端,寫下面的命令:

openssl x509 -in 后臺給的.crt -out 想要的名字.cer -outform der

然后把生成的:想要的名字.cer文件導(dǎo)入到工程中,在自己封裝AFNetworking的類中,寫如下代碼:

+ (AFSecurityPolicy *)customSecurityPolicy
{
    //先導(dǎo)入證書,找到證書的路徑
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Admin" ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    
    //AFSSLPinningModeCertificate 使用證書驗(yàn)證模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    
    //allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO
    //如果是需要驗(yàn)證自建證書,需要設(shè)置為YES
    securityPolicy.allowInvalidCertificates = YES;
    
    //validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES;
    //假如證書的域名與你請求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書,也可以建立連接,這個非常危險(xiǎn),建議打開。
    //置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的;當(dāng)然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。
    //如置為NO,建議自己添加對應(yīng)域名的校驗(yàn)邏輯。
    securityPolicy.validatesDomainName = NO;
    NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
    securityPolicy.pinnedCertificates = set;
    
    return securityPolicy;
}

然后在封裝的get請求或者是是post請求的地方,調(diào)用上面的這段代碼:

+ (void)postWithURLString:(NSString *)urlString
               parameters:(id)parameters
                  success:(SuccessBlock)successBlock
                  failure:(FailureBlock)failureBlock
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.requestSerializer.timeoutInterval = outTime;
    //HTTPS SSL的驗(yàn)證,在此處調(diào)用上面的代碼,給這個證書驗(yàn)證;
    [manager setSecurityPolicy:[SYNetworkingManager customSecurityPolicy]];
    [manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (successBlock) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
            successBlock(dic);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failureBlock) {
            failureBlock(error);
            NSLog(@"網(wǎng)絡(luò)異常 - T_T%@", error);
        }
    }];
}

當(dāng)我們的工程中有SDWebimage這個第三放庫的時候,加載HTTPS的圖片時,在iOS8上面沒有問題,但是在iOS9上面,控制臺就會報(bào)這樣的錯誤:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

大概意思也是說網(wǎng)絡(luò)請求證書的問題,不過我還沒有解決這個問題,在網(wǎng)上找了好多,沒有找到一個好的方法,如果有哪位朋友遇到這樣的問題了,還希望可以在此處給解答一下,千恩萬謝?。?!

如果想要了解對AFNetworking的封裝,請猛戳下面的鏈接:http://www.itdecent.cn/p/bf4e62fe9474

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 一、作用 不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文傳播,帶來了三大風(fēng)險(xiǎn)。 (1)竊聽風(fēng)險(xiǎn)...
    XLsn0w閱讀 11,058評論 2 44
  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,690評論 0 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,070評論 25 709
  • 當(dāng)Grace 分享《沒經(jīng)驗(yàn),是你最大的優(yōu)勢》,她說她最后看到淚奔,所以一定值得看。然后我就迫不及待的拍了回...
    龔小思閱讀 422評論 0 1

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