iOS開發(fā)AFN配置HTTPS的SSL證書

原定于2017年1月1日起所有提交到 App Store 的App必須強制開啟 ATS,需要配置Https。但是現(xiàn)在不需要了,無固定期限的往后延期了,但是這個還是得弄明白下為好,說不定哪天突然就讓弄了。
一、 2017年1月1日起所有提交到 App Store 的App必須強制開啟 ATS。
就是要求去掉 Info.plist 的 NSAllowsArbitraryLoads
1.這要求所有通過APP發(fā)送的網(wǎng)絡請求都需要https

2.開啟ATS,圖片(例如圖像的URL)等靜態(tài)文件的url需要用https,否則會無法加載;

3.對于H5,網(wǎng)頁瀏覽和視頻播放的行為,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 鍵。通過將它設置為 YES ,
可以讓你的 app 中的 WKWebView 和使用 AVFoundation 播放的在線視頻不受 ATS 的限制。
這也應該是絕大多數(shù)使用了相關特性的 app 的選擇。但是壞消息是這個鍵在 iOS 9 中并不會起作用.

4.iOS9中可以選擇使用 NSExceptionDomains 來針對特定的域名開放 HTTP 應該要相對容易過審核?!靶枰L問的域名是第三方服務器,他們沒有進行 HTTPS 對應”會是審核時的一個可選理由,但是這應該只需要針對特定域名,而非全面開放。如果訪問的是自己的服務器的話,可能這個理由會無法通過。是需要在Info.plist 配置中的XML源碼

 <key>NSAppTransportSecurity</key>  
 <dict>  
     <key>NSExceptionDomains</key>  
     <dict>  
         <key>XXX.com</key>  
         <dict>  
             <!--適用于這個特定域名下的所有子域-->  
             <key>NSIncludesSubdomains</key>  
             <true/>  
             <!--擴展可接受的密碼列表:這個域名可以使用不支持 forward secrecy 協(xié)議的密碼-->  
             <key>NSExceptionRequiresForwardSecrecy</key>  
             <false/>  
             <!--允許App進行不安全的HTTP請求-->  
             <key>NSExceptionAllowsInsecureHTTPLoads</key>  
             <true/>  
             <!--在這里聲明所支持的 TLS 最低版本-->  
             <key>NSExceptionMinimumTLSVersion</key>  
             <string>TLSv1.1</string>  
         </dict>  
     </dict>  
 </dict>  

二、 目前項目中用到的第三方已經(jīng)支持https的有

WKWebView  
UIWebView  
SDWebImage  
 支付寶SDK  
 微信支付SDK  
 友盟SDK  
 極光推送SDK  
其中用到的UIWebView 以后要逐步替換為WKWebView 

上面內(nèi)容參考于:http://blog.csdn.net/zhangmengleiblog/article/details/53536956

三、下面是在AFN中配置實例:

+ (AFSecurityPolicy*)customSecurityPolicy
{
// /先導入證書
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" 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;

securityPolicy.pinnedCertificates = @[certData];

return securityPolicy;
}

將上面的方法添加到我們AFN請求數(shù)據(jù)中

+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
    // 1.獲得請求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    // 2.申明返回的結(jié)果是text/html類型
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

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

// 3.發(fā)送POST請求
[mgr POST:url parameters:params
  success:^(AFHTTPRequestOperation *operation, id responseObj) {
      if (success) {
          success(responseObj);
      }
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      if (failure) {
          failure(error);
      }
  }];
}

上面參考于 http://blog.csdn.net/canlanyangg/article/details/53559597 這篇文章。
四.關于證書 參考文章:http://www.2cto.com/Article/201510/444706.html
服務端給的是crt后綴的證書,其中iOS客戶端用到的cer證書,是需要開發(fā)人員轉(zhuǎn)換:
1.證書轉(zhuǎn)換
在服務器人員,給你發(fā)送的crt證書后,進到證書路徑,執(zhí)行下面語句

openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der

這樣你就可以得到cer類型的證書了。雙擊,導入電腦。
2.證書放入工程
1、可以直接把轉(zhuǎn)換好的cer文件拖動到工程中。
2、可以在鑰匙串內(nèi),找到你導入的證書,單擊右鍵,導出項目,就可以導出.cer文件的證書了

參考鏈接:http://www.itdecent.cn/p/97745be81d64。

五.在info.plist去掉之前允許http加載的代碼 就是刪除下面的代碼(么有的就省了這一步)

<key>NSAppTransportSecurity</key>  
<dict>  
<key>NSAllowsArbitraryLoads</key>  
<true/>  
</dict>  

六、可能出現(xiàn)的問題:
6.1服務器可能出現(xiàn)的問題:

Error Domain=NSURLErrorDomain Code=-1200 "發(fā)生了 SSL 錯誤,無法建立與該服務器的安全連接。" UserInfo=    {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef:     0x15dd87140>, NSLocalizedRecoverySuggestion=您仍要連接此服務器嗎?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (
0 : <cert(0x15f3559e0) s: dbh i: dbh>
)}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x15dd87140>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (
0 : <cert(0x15f3559e0) s: dbh i: dbh>
)}}}, NSLocalizedDescription=發(fā)生了 SSL 錯誤,無法建立與該服務器的安全連接。, NSErrorFailingURLKey=https://192.168.1.138/app/login/login.json, NSErrorFailingURLStringKey=https://192.168.1.138/app/login/login.json, NSErrorClientCertificateStateKey=0}

可能是服務器配置的證書不對,蘋果要求是TLS1.2,服務端配置是TLS1.0。
也有可能是后臺簽名算法問題 https://my.oschina.net/vimfung/blog/494687
6.2、證書一定要拉到項目里面,AFN加了驗證之后,看看獲取證書的certData是否為空。如果為空,則證書有問題

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

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

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