iOS 適配HTTPS方法

一切為了迎合蘋果

在WWDC 2016開發者大會上,蘋果宣布了一個最后期限:到2017年1月1日 App Store中的所有應用都必須啟用 App Transport Security安全功能。App Transport Security(ATS)是蘋果在iOS 9中引入的一項隱私保護功能,屏蔽明文HTTP資源加載,連接必須經過更安全的HTTPS。蘋果目前允許開發者暫時關閉ATS,可以繼續使用HTTP連接,但到年底所有官方商店的應用都必須強制性使用ATS。但如果2017年1月1日起您仍一意孤行那么在Apple Store中您的App將不能被用戶下載使用。

兼容HTTP

新特性要求App內訪問的網絡必須使用HTTPS協議。
但是現在公司的項目使用的是HTTP協議,使用私有加密方式保證數據安全。現在也不能馬上改成HTTPS協議傳輸,需要兼容下HTTP。
網絡請求報錯:The resource could not be loaded because the App Transport Security policy require:

所以先兼容下http:

  1. Info.plist中添加NSAppTransportSecurity類型Dictionary
  2. NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設為YES
  3. 為了適配webView中的http鏈接:在NSAppTransportSecurity下添加Allow Arbitrary Loads in Web Content類型Boolean,值設為YES

適配HTTPS

iOS開發者來說,需要盡早解決HTTPS請求的問題。

發送HTTPS請求信任SSL證書和自簽名證書,分為三種情況:

  1. (較少的公司)如果你的app服務端安裝的是SLL頒發的CA,可以使用系統方法直接實現信任SSL證書,關于Apple對SSL證書的要求請參考:蘋果官方文檔CertKeyTrustProgGuide
    示例代碼:
NSURL *URL = [NSURL URLWithString:URLString];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];//創建同步連接NSError *error = nil;NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; NSString *receivedInfo = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
  1. (大部分公司)基于AFNetWorking的SSL特定服務器證書信任處理,使用自簽名證書認證,重寫AFNetWorking的customSecurityPolicy方法。
    ###驗證證書步驟:
  2. 從服務器要來.crt格式的證書,然后用Mac鑰匙串打開,然后導出?.cer格式的證書
  • .cer證書導入程序的 中。
  • 驗證證書的代碼:
/**https證書驗證*/
+(AFSecurityPolicy*)customSecurityPolicy
{// /先導入證書NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"cer"];//證書的路徑NSData *certData = [NSData dataWithContentsOfFile:cerPath];// AFSSLPinningModeCertificate 使用證書驗證模式 (AFSSLPinningModeCertificate是證書所有字段都一樣才通過認證,AFSSLPinningModePublicKey只認證公鑰那一段,AFSSLPinningModeCertificate更安全。但是單向認證不能防止“中間人攻擊”)AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO// 如果是需要驗證自建證書,需要設置為YESsecurityPolicy.allowInvalidCertificates = YES;//validatesDomainName 是否需要驗證域名,默認為YES;//假如證書的域名與你請求的域名不一致,需把該項設置為NO;如設成NO的話,即服務器使用其他可信任機構頒發的證書,也可以建立連接,這個非常危險,建議打開。//置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的;當然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。//如置為NO,建議自己添加對應域名的校驗邏輯。securityPolicy.validatesDomainName = NO;securityPolicy.pinnedCertificates = (NSSet *)@[certData];return securityPolicy;
}

其中的cerPath就是app bundle中證書路徑,certificate為證書名稱的宏,僅支持cer格式,securityPolicy的相關配置尤為重要,請仔細閱讀customSecurityPolicy方法并根據實際情況設置其屬性。

這樣,就能夠在AFNetWorking的基礎上使用HTTPS協議訪問特定服務器,但是不能信任根證書的CA文件,因此這種方式存在風險,讀取pinnedCertificates中的證書數組的時候有可能失敗,如果證書不符合,certData就會為nil。

  • 在發送請求時候 加上這行代碼,https ssl 驗證。
//    [[AFHTTPSessionManager manager] setSecurityPolicy:[JYAFNetworkingManager customSecurityPolicy]];
  1. 更改系統方法,發送異步NSURLConnection請求。
    這種方式用的很少就不多介紹了有新區可以自行搜索;

大部分可以參考:
http://www.jianshu.com/p/f312a84a944c
http://www.jianshu.com/p/6b9c8bd5005a
http://www.jianshu.com/p/b03ae4a1a2d3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247499.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模板—tarjan求割邊

int dfn[MAXN],low[MAXN],cnt; void tarjan(int x,int edg) {low[x]dfn[x]cnt;for(int if(x);i;in(i))if(!dfn[v(i)]){tarjan(v(i),i);low[x]min(low[x],low[v(i)]);if(low[v(i)]>dfn[x])isbridge[i]isbridge[i^1]1;}else if(i!(edg^1))low[x]min(low[x],dfn(v(i))); } 轉載…

GoJs Pictures 官方介紹文檔

圖片 使用Picture類顯示圖像。 最常見的用法是使用URL字符串設置Picture.source屬性,以及通過GraphObject.desiredSize(圖對象的所需尺寸)獲取或通過設置GraphObject.width(圖對象的寬)和GraphObject.height&#xff0…

怎樣購買及安裝ssl安全證書

查找資料記錄,不是我的項目筆記 現在越來越多的網站都開始用安全鏈接了,在國外的話,如果不是一個安全鏈接,用戶很大程度上會拒絕使用,所有安全鏈接是未來的趨勢,樓主第一次配安全證書的時候,剛剛…

XmlViewResolver 和 ResourceBundleViewResolver

使用XmlViewResolver 如果視圖對象的 Bean 數目太多,那么直接在 smart-servlet.xml 文件中配置,勢必影響主配置文件的簡潔性。XmlViewResolver 和 BeanNameViewResolver 功能相似,唯一不同的是它可以將視圖 Bean 定義在一個獨立的 XML 文件中…

(轉載)Git使用教程:最詳細、最傻瓜、最淺顯、真正手把手教!

轉載自 Git使用教程 預警:因為詳細,所以行文有些長,新手邊看邊操作效果出乎你的預料)一:Git是什么? Git是目前世界上最先進的分布式版本控制系統。 工作原理 / 流程: Workspace:工作…

soureTree中如何設置git 用戶名與密碼 SourceTree提交修改用戶詳細圖文方法

mac上軟件更新: 現在沒有網絡小模塊了,在同行右邊高級里面有默認用戶名刪除即可!!!! sourceTree 切換Git登錄用戶,之前在SourceTree提交遠程服務用的是同事的賬號,同事離職后賬號也…

shell 腳本 生成文件,文件名為日期時間

腳本如下 #/bin/bashfilename$(date %Y%m%d)_$(date %H%M%S) touch $filename.txt 其中 $() 表示括號中的 shell 命令的結果,所以 filename 是一個字符串,比如 20190714_111631,即 2019 年 7 月 14 日 11 點 16 分 31 秒。 然后第二行命令&am…

js利用HTML5的拖拽API做流程圖

上代碼 直接用看效果&#xff0c;學習一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style type"text/css">#d1{width:800px;height:800px;border: 1…

Pots (BFS ? 輸出路徑)

題目鏈接&#xff1a;http://poj.org/problem?id3414 思路&#xff1a; 因為有六種操作&#xff0c;所以六種操作中合法的都加入隊列中BFS 如何去輸出路徑呢&#xff1f; 我們不妨設一個string數組&#xff0c;它的索引就和我們的步數有關&#xff0c;然后按順序輸出就可以了…

box-sizing的使用

box-sizing 人們慢慢的意識到傳統的盒子模型不直接&#xff0c;所以他們新增了一個叫做 box-sizing 的CSS屬性。當你設置一個元素為 box-sizing: border-box; 時&#xff0c;此元素的內邊距和邊框不再會增加它的寬度。這里有一個與前一頁相同的例子&#xff0c;唯一的區別是兩…

vue-router的hash模式和history模式,

hash模式背后的原理是onhashchange事件,可以在window對象上監聽這個事件: window.onhashchange function(event){ console.log(event.oldURL, event.newURL); let hash location.hash.slice(1); document.body.style.color hash; } 上面的代碼可以通過改變hash來改變頁面字體…

更新node最新版本方法和 npm install -g n 運行錯誤

使用xshell連接linux服務器后&#xff0c;首先輸入node -v查看當前使用的版本 如果上面查看的版本比較低&#xff0c;則可以開始升級 清除npm cache 升級之前還需要安裝n模塊&#xff0c;n模塊是專門用來管理nodejs的版本 輸入npm install -g n n模塊安裝完成之后&#x…

vue-router的路由

路由和組件是有區別的&#xff1a;組件一般是在同一個頁面的不同模塊&#xff0c;但是路由是直接切換到另一個頁面&#xff0c;之前的頁面銷毀。 App.vue中的router-view會渲染頂級路由匹配到的組件。組件內部嵌套的router-view會渲染子路由匹配到的組件。 當路由跳轉的時候&am…

mac上的更新node npm

查看當前node版本 $ node -v v8.9.4 清除node.js的cache(不確定有沒有必要) $ sudo npm cache clean -f Password: npm WARN using --force I sure hope you know what you are doing. 安裝工具n &#xff0c;這個工具是專門用來管理node.js版本的 $ sudo npm install -g …

電源芯片選擇DC/DC還是LDO?《轉》

這個取決于你的應用場合。比如用在升壓場合&#xff0c;當然只能用DC/DC&#xff0c;因為LDO是壓降型&#xff0c;不能升壓。另外看下各自的主要特點&#xff1a; DC/DC:效率高&#xff0c;噪聲大&#xff1b; LDO:噪聲低&#xff0c;靜態電流小&#xff1b; 所以如果是用在壓降…

Atom React或前端插件推薦

分享一些Atom個人在用的插件,喜歡請點贊 1. color-picker 取色工具 2. pigments 編輯器中直接查看代碼所代表的顏色&#xff0c;工具雖小但是很實用。 3. minimap 仿sublime text的縮略代碼查看&#xff0c;想找的地方一目了然。 4. highlight-selected 選擇某段代碼自動高…

Nike Kyrie 1 Performance Review

Traction – There has been many varying opinions on the Kyrie 1’s traction, and I don’t think any of them have been wrong. I’d say under the right conditions, the traction is excellent. I’ve experienced nothing but great traction out of them, but all o…

Tapable.plugin is deprecated. Use new API on `.hooks` instead

問題描述 在使用extract-text-webpack-plugin給webpack打包時出現報錯 Tapable.plugin is deprecated. Use new API on .hooks instead 1 問題原因 extract-text-webpack-plugin目前版本不支持webpack4。 解決方案 使用extract-text-webpack-plugin的最新的beta版 npm inst…

第二周進度總結

本周主要在完成假期作業&#xff0c;學習的時間大部分花在代碼上。完成了3個代碼的編譯。第一個是害死人不償命的(3n1)猜想。第二個是成績排名&#xff08;輸出成績最高和成績最低學生的姓名和學號&#xff09;。第三個是換個格式來輸出任一個不超過 3 位的正整數。這三個題目中…

webpack.optimize.CommonsChunkPulgin is not a constructor???請看CommonsChunkPlugin VS SplitChunksPlugin

webpack團隊人員臥薪嘗膽五個多月的時間終于帶來的webpack4&#xff0c;個人覺得webpack4帶來的最大優化便是對于懶加載塊拆分的優化&#xff0c;刪除了CommonsChunkPlugin&#xff0c;新增了優化后的SplitChunksPlugin&#xff0c;那么CommonsChunkPlugin的痛點在哪&#xff1…