iOS 適配 https 以及 code = -999 錯(cuò)誤

1.生成.cer文件,并且拖入到自己的項(xiàng)目中
在終端操作:
openssl s_client -connect www.baidu.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer
注: 將 www.baidu.com 換成你的接口域名 , 最后面的 https.cer 就是你導(dǎo)出的cer證書(shū)名字
2.Xcode info.plist 添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3.使用 AFN

  • (void)testATS {
    //先導(dǎo)入證書(shū),找到證書(shū)的路徑
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];

    //AFSSLPinningModeNone 這個(gè)模式表示不做 SSL pinning,只跟瀏覽器一樣在系統(tǒng)的信任機(jī)構(gòu)列表里驗(yàn)證服務(wù)端返回的證書(shū)。若證書(shū)是信任機(jī)構(gòu)簽發(fā)的就會(huì)通過(guò),若是自己服務(wù)器生成的證書(shū),這里是不會(huì)通過(guò)的。
    //AFSSLPinningModeCertificate 這個(gè)模式表示用證書(shū)綁定方式驗(yàn)證證書(shū),需要客戶端保存有服務(wù)端的證書(shū)拷貝,這里驗(yàn)證分兩步,第一步驗(yàn)證證書(shū)的域名/有效期等信息,第二步是對(duì)比服務(wù)端返回的證書(shū)跟客戶端返回的是否一致。
    //AFSSLPinningModePublicKey 這個(gè)模式同樣是用證書(shū)綁定方式驗(yàn)證,客戶端要有服務(wù)端的證書(shū)拷貝,只是驗(yàn)證時(shí)只驗(yàn)證證書(shū)里的公鑰,不驗(yàn)證證書(shū)的有效期等信息。只要公鑰是正確的,就能保證通信不會(huì)被竊聽(tīng),因?yàn)橹虚g人沒(méi)有私鑰,無(wú)法解開(kāi)通過(guò)公鑰加密的數(shù)據(jù)。
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    if (certData) {
    securityPolicy.pinnedCertificates = @[certData];
    }
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    [sessionManager setSecurityPolicy:securityPolicy];
    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    sessionManager.responseSerializer.acceptableContentTypes = [sessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

    NSString *urlStr = @"https:www.baidu.com";
    [sessionManager GET:urlStr parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"responseObject = %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"error = %@", error);
    }];
    }
    因?yàn)橹笆褂昧?AFSSLPinningModeCertificate 模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    改成現(xiàn)在的 AFSSLPinningModeNone 模式,解決問(wèn)題。
    因?yàn)槲业淖C書(shū)是 Symantec 的 DV SSL 證書(shū),所以 securityPolicy 的 allowInvalidCertificates 和 validatesDomainName 屬性都是默認(rèn)值??。之前沒(méi)有改成默認(rèn)一直在報(bào) code = -999.

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

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

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