我正在使用https與服務器通信的iOS企業POS應用程序。我已經看過Receiving SSL error in iOS7 GM - "AddTrust External CA Root" is not trusted?和Difference between self-signed CA and self-signed certificate,並且通常搜索網頁,但我沒有找到任何地方。SSL - 在iOS7中表現有所不同?
該應用在iOS6.1上使用http或https協議工作正常。它也可以通過http在iOS 7GM上正常工作,但不能通過https - 它在發送給服務器的第一條消息時失敗。在應用程序方面我處理的認證挑戰:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
}
之後,我得到一個回調:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
NOT:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
我相信,這意味着客戶機和服務器成功協商連接,同意加密協議等。不幸的是,儘管返回看起來成功(就網絡堆棧而言),但我在AMF pa中返回了0字節的數據yload。
這裏有一個有趣的現象 - 在服務器端(JBoss4.2.3)我可以設置斷點並檢查包含AMFRequest的HttpRequest的身體。通過HTTP,我總是可以在主體中獲得384個字節。通過https,如果客戶端是iOS 6.1,則獲得384字節,但如果客戶端是iOS 7,則獲得0字節。我認爲https請求被服務器「正常」接受,沒有錯誤,安全違規等。
還有一個數據點。如果我在客戶端運行Charles,那麼通過使用iOS 7模擬器的https可以正常工作。我可以在Charles和服務器上看到我的384字節的AMFRequest。查爾斯是一名http代理人 - 但該應用程序對此並不知情,那麼爲什麼插入查爾斯作爲中間人使其工作?我已經安裝了Charles的證書,所以我認爲它是通過SSL與服務器通信的(不知道肯定)。
感謝您的任何幫助或建議。
更新:我實現了蘋果公司推薦的方法:
- (void)connection: (NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
traceMethod();
SecTrustRef trust = challenge.protectionSpace.serverTrust;
NSURLCredential *credential = [NSURLCredential credentialForTrust: trust];
[challenge.sender useCredential: credential
forAuthenticationChallenge: challenge];
}
,但它得到完全相同的結果如舊(前iOS 5中)的方式。
感謝您的信息。我不認爲就是這樣。在我們的情況下,我們只需要一個加密流(以符合cc安全標準),所以我們總是回覆「serverTrust」。 –
歡迎你,值得一試;)祝你好運! – Wirsing