2016-09-20 99 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