最近為了新的存管app
上線裙品,忙了近一個月,重新過了一段996
的日子俗或,今天終于可以喘口氣清酥,繼續(xù)更新博客了。本文記錄一下在iOS 9
中發(fā)送https
請求遇到的問題及解決辦法蕴侣,希望通過本文焰轻,可以對ATS
的配置有一個更深入的了解。
問題描述
在開發(fā)app
時昆雀,遇到了在iOS 9
中發(fā)送https
請求報(bào)錯的問題:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
我們知道辱志,在iOS 9
以后,所有的網(wǎng)絡(luò)請求默認(rèn)使用https
狞膘,如果你發(fā)送http
請求揩懒,則會報(bào)如下錯誤,但是我們可以通過在info.plist
中設(shè)置NSAppTransportSecurity - NSAllowsArbitraryLoads
的值為YES
來允許http
請求:
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
info.plist
<Center>
</Center>
這樣解決了http
的請求問題挽封,但是我發(fā)送是https
請求已球,還是出現(xiàn)HTTP laod failed
的問題,盡管使用上述方法也可以解決辅愿,但這不是根本的解決辦法智亮。
解決辦法
經(jīng)過分析,懷疑是TLS
的問題点待,因?yàn)?code>iOS 9默認(rèn)需要TLS1.2版本來加密數(shù)據(jù)阔蛉,如果服務(wù)端不支持TLS1.2
,則URLSession:task:didCompleteWithError:
會返回nil
的error
癞埠,但是后端開發(fā)同事說服務(wù)器支持TLS1.0
状原、TLS1.1
和TLS1.2
聋呢,這好像又不是TLS
的問題。于是不放心颠区,用nscurl
測試了一下測試服務(wù)器削锰,果然不支持TLS1.2
,問題找到毕莱。
# 加 --verbose 是為了顯示詳細(xì)的調(diào)試信息
/usr/bin/nscurl --ats-diagnostics --verbose https://testresource.chaoaicai.com
通過輸出看出喂窟,服務(wù)器只支持TLS1.0
,于是讓后臺開發(fā)的同事測試并修改后央串,再次測試,發(fā)現(xiàn)服務(wù)器支持TLS1.2
了碗啄,并且https
的網(wǎng)絡(luò)請求也正常了质和。
ATS異常配置
其實(shí),針對服務(wù)器不支持TLS1.2
稚字,而客戶端發(fā)送https
請求還有其它的解決方法饲宿,就是配置ATS,設(shè)置最低的TLS
版本即可胆描,如下info.plist
所示:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<!--你的https域名-->
<key>testresource.chaoaicai.com</key>
<dict>
<!--允許子域-->
<key>NSIncludesSubdomains</key>
<true/>
<!--TLS允許的最低版本號-->
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
</dict>
</dict>
</dict>
其中瘫想,NSExceptionDomains
的具體設(shè)置項(xiàng)介紹如下,可以更詳細(xì)的了解ATS
的異常配置
- NSIncludesSubdomains:是否應(yīng)用到子域名昌讲,默認(rèn)是NO
- NSExceptionAllowsInsecureHTTPLoads:是否允許http請求国夜,YES(允許),默認(rèn)是NO
- NSExceptionMinimumTLSVersion:最低的TLS版本
- NSExceptionRequiresForwardSecrecy:是否需要前置加密短绸,NO(允許加密车吹,但不支持PFS:perfect forward secrecy),默認(rèn)是YES
- NSRequiresCertificateTransparency:是否需要有效的簽名證書醋闭,YES(需要)窄驹,默認(rèn)是NO
本文只是簡單的介紹了一下如何配置ATS
,及解決由于服務(wù)器不支持TLS1.2
造成的https
無法訪問的問題证逻,需要了解https
乐埠、TLS
的具體工作流程,請參考相關(guān)資料囚企。
參考資料
#iOS問題記錄#關(guān)于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) on a subdomain?