2016-09-20 97 views
1

並提前致謝。iOS應用突然無法通過HTTPS連接IPv6後更改

一切都在我的應用程序,這是基本完成的偉大工作。應用程序已完成,並將自定義VPS服務器設置爲後端。然後,閱讀Apple提交指南,我確保我的服務器兼容IPv6。

現在突然間我無法通過HTTPS連接到我的服務器。它仍然可以通過HTTP連接(如果我返回並更改網址)。此外,我能夠在IPv6更改之前通過HTTPS進行連接。

現在我得到這個錯誤在Xcode控制檯:

--- NSURLConnection的/ CFURLConnection HTTP加載失敗(kCFStreamErrorDomainSSL,-9813)---

我一直在閱讀有關解決方法的其他職位,但我想保持我的應用程序合法。它之前正在使用HTTPS,我不明白爲什麼IPv6更改會導致此問題。我知道我可以修改應用程序傳輸安全密鑰,但是我希望這可以用於製作,並且我不希望蘋果拒絕。

它不是一個自簽名證書,並且所有內容都在手邊完全有效。

我聯繫了我的服務器公司,他們不知道是什麼問題。我正在使用NSURLSession,並且一個典型的連接看起來像這樣(除了你在下面看到之外,我還沒有實現任何NSURLSession委託方法或自定義)。

//VALUES TO BE POSTED 
NSMutableString *post = [NSMutableString stringWithFormat:@"u=%@&p=%@", username, password]; 


//PERCENT ESCAPE THE URL 
[post setString:[post stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 


//CONVERT POST VALUES TO DATA 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 


//RETRIEVE LENGTH OF DATA FOR PURPOSES OF POST HEADER 
NSString *postLength = [NSString stringWithFormat:@"%d", (int)[postData length]]; 


//BUILD THE URL REQUEST 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:@"https://www.example.com/"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody:postData]; 



//CREATE SESSION FOR SERVER CONTACT 
NSURLSessionDataTask *sessionTask = [[NSURLSession sharedSession] dataTaskWithRequest:request 
      completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 


AND SO ON.... 
+0

你的代碼看起來很簡單。我建議在StackOverflow的兄弟網站serverfault.com上詢問如何驗證您的IPv6 + TLS設置是否正確並正常工作。 –

回答

1

由錯誤代碼來看,我敢肯定你的服務器是在IPv6模式配置不正確,而不是服務於完整的證書鏈(丟失或不正確的中間證書)。當然,我不能確認,不知道服務器的名稱,但你可以檢查它:

openssl s_client -connect host:443 

並看看它說什麼。當然,如果它試圖通過IPv4進行連接......您可能必須使用IPv6地址而不是主機名。我從來沒有嘗試使用IPv6的s_client,所以YMMV。 :-)

+0

我很感謝您的回覆。我現在會研究這些事情並回復你。是建立一個每個人都經歷過的VPS到IPv6,或者我首先做了一些不必要的事情。我的意思是,我在Apple提交指南中看到它,但它似乎不是許多人討論的話題。 – ARENV

+0

我按照你的建議運行了命令。我得到以下錯誤:「getaddrinfo:名稱或服務未知。connect:errno = 2」 – ARENV

+0

從技術上講,您的服務器不支持IPv6。當iOS 10獲得僅限IPv4的應答時,它將透明地構建一個特殊地址,以便通過IPv4 over IPv6隧道路由流量。當然,您必須測試您的應用程序以確保它在該環境中正常工作。 – dgatwood