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

我們透過 Xamarin.iOS 使用 UIWebView 的方式來載入我們的系統。

最近有一些 iPad 在使用時會出現白白的畫面,沒辦法呈現我們的網頁。

透過 Xamarin Studio 來 Debug 時,會出現以下的錯誤訊息,

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

在執行 APP 前要先透過客戶的 VPN APP 連上 VPN 之後,我們的 APP 才可以連到我們的網頁。
而我們的網頁也走 https 了,為什麼還會發生那個錯誤呢?

查詢網路上的說明,都說要在 info.plist 中加入 NSAllowsArbitraryLoadsInWebContent 等其他的設定,並設定為 Yes 。 結果還是沒有效。

後來透過 MAC VPN 進去,透過 nscurl 測試一下,

nscurl --ats-diagnostics --verbose https://我們的網址

結果真的出現一堆錯誤,而且結果都是 FAIL ,如下,

Configuring TLS exceptions for


TLSv1.2
ATS Dictionary:
{
NSExceptionDomains = {
“" = {
NSExceptionMinimumTLSVersion = “TLSv1.2″;
};
};
}
Result : FAIL
Error : Error Domain=NSURLErrorDomain Code=-1200 “An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7ffda450bd80 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 “(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https:///eod, NSErrorFailingURLStringKey=https:///eod, _kCFStreamErrorDomainKey=3}

Allowing Arbitrary Loads


Allow All Loads
ATS Dictionary:
{
NSAllowsArbitraryLoads = true;
}
Result : FAIL
Error : Error Domain=NSURLErrorDomain Code=-1202 “The certificate for this server is invalid. You might be connecting to a server that is pretending to be “” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, NSErrorPeerCertificateChainKey=(
“"
), NSUnderlyingError=0x7ffda473b240 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 “(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9813, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, kCFStreamPropertySSLPeerCertificates=(
“"

)}}, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “” which could put your confidential information at risk., NSErrorFailingURLKey=https:///eod, NSErrorFailingURLStringKey=https:///eod, NSErrorClientCertificateStateKey=0}

顯然客戶 VPN 的憑證 iPad 應該是直接給他退貨 … 呵! 呵!

但奇怪的是,客戶有問題的 iPad 的 iOS 版本為 10.0.1 ,我們用 iPad 的 iOS 版本為 10.3.2 卻沒有這種問題。

透過模擬器來執行不同版本果然是 10.0.1 會出現那個錯誤,而 10.3.2 就不會出現那個問題。

最後建議客戶將 iPad 升級到 10.3.2 ,或是檢視一下 vpn 憑證。

所以如果大家有類似的問題,可以檢查看看是不是 iOS 10.0.1 ,並用 nscurl 指令檢查看看哦!