2014-01-09 43 views
18

我使用Cordova 3.2和jquery mobile 1.3創建了一個iOS應用程序。我使用jquery ajax向RESTfull服務發送請求以檢索/更新信息。科爾多瓦應用程序中的HTTP加載失敗(kCFStreamErrorDomainSSL,-9813)

我有許多測試設備,各種iPhone,各種不同的iOS版本。在iPhone 4S,運行iOS 7,我收到的時候任何Ajax請求發送以下錯誤:

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) 

這只是發生在此設備上,在另一部iPhone 4S,也運行iOS 7,它的工作原理精絕,如它可以在我使用的所有其他測試設備上使用。

我讀過,這表明證書在某種程度上是無效的,既然如此,可以忽略它,爲什麼會影響一臺設備?

任何人都可以提出爲什麼這可能會發生,什麼可能是不同的設備,將阻止它只能在我的一個設備上工作。謝謝

回答

12

如果它適用於某些設備而不是其他設備,那麼這些設備的證書驗證參數會有所不同。這裏有一些事情要看看:

  1. 快樂的設備有一些根證書,不愉快的設備不?特別是如果它們運行的​​是不同的iOS版本,它們也可能具有不同的可信證書列表。嘗試去設置>常規>關於並在底部比較「Trust Store」的數字。查看更多信息here
  2. 您是否在過去的某個時間在手機上接受過某些中級證書(用於簽署此證書)?*
  3. 不愉快的設備上的日期/時間錯誤?如果它設置爲證書到期日期之後或證書頒發日期之前的時間,它將拒絕它。我總是用自己的腳射向自己!

如果您在不愉快設備上的瀏覽器中訪問您的端點URL,它會給您帶來什麼樣的錯誤? (注意:顯然你的服務器也會給你一些錯誤,因爲你沒有用正確的頭文件和參數進行請求,但我正在談論Safari本身 - 它應該給出一個更詳細的信息, 。錯誤的證書)

*編輯,以糾正一些我記錯了:你有,如果你去在Safari瀏覽器的URL接受葉證書的選項,你只有當接受中間證書的選項你試圖直接加載它們。

+0

問題實際上是服務器端缺少的中間證書。一旦這個糾正,所有的設備變得「快樂」。我認爲你的前兩點之一肯定是這種情況(我確實將快樂和不愉快的設備重置爲出廠默認設置,但他們仍然執行相同的操作) –

+0

@MartinCassidy您是如何在服務器端生成缺少的中間證書的? ?我也在使用Apache中的自簽名證書進行測試,並得到相同的錯誤代碼 - 在桌面上運行,但不在iPhone 5S上運行 – user1361529

+0

@ user1361529這不是我做的,服務器管理員已將它整理出來。這不是一個自簽名的證書。對不起,我不能有更多的幫助。 –

33

我有一個類似的問題,但在我的情況下,這在過去發生的所有設備,只有在與https的ajax呼叫。

如果這是你的情況,在appDelegate.m文件的末尾添加下面的代碼將緩解你的問題。

@implementation NSURLRequest(DataController) 
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
return YES; 
} 
@end 

但我懷疑如果它在其他設備上工作,我給出的解決方案可能無效。但是請試一試。

+9

對於測試目的非常有用(我只是設置生產服務器的克隆來重現問題,顯然它使用與我們的真實站點不同的域,所以它的SSL證書無效)。儘管如此,從來沒有在生產代碼中做過這件事 - 它和使用SSL一樣好。 – Arkaaito

+0

我的確想過嘗試這個,但已經讀過蘋果會拒絕這個應用,如果我使用它,所以不會真的解決問題 –

+0

我有一個應用程序批准此代碼,但不是一個好主意,使用它正如Arkaait所說的那樣,使用這個並沒有使用SSL。 – jcesarmobile

1

我在模擬器中運行應用程序時遇到了同樣的問題。背後的原因是模擬器中沒有可信任的證書。

只需拖動&將您的.cer文件拖放到正在運行的模擬器窗口中。你會看到閃爍的Safari瀏覽器,然後導入對話框您的證書(或證書頒發機構)...

+0

也確保在需要時啓用根信任設置https://support.apple.com/kb/PH20127?locale=zh_CN&viewlocale=zh_CN – ObjectNameDisplay

2

Markivs answer雨燕版本(從here拍攝):

extension NSURLRequest { 
    static func allowsAnyHTTPSCertificateForHost(host: String) -> Bool { 
     return true 
    } 
} 
+0

這對我有用!謝謝@Chris – VaroX

2

的Xcode 7.3雨燕2.2

爲了得到這個工作,我不得不做3兩件事:

  1. 我不得不關閉後,克里斯的回答^添加到AppDelegate.swift底部}爲類
  2. 然後使用這個答案https://stackoverflow.com/a/32701693
  3. 得到更多的信息,請確保您的服務器,而不是一個IP地址設置域名
相關問題