iOS IPv6 更改后应用突然无法通过 HTTPS 连接

iOS app suddenly can't connect via HTTPS after IPv6 change

提前致谢。

我的应用程序一切正常,基本上已经完成。应用程序已完成,自定义 VPS 服务器已设置为后端。然后,阅读 Apple 提交指南,我确保我的服务器与 IPv6 兼容。

现在我突然无法通过 HTTPS 连接到我的服务器。它仍然通过 HTTP 连接良好(如果我返回并更改 url)。此外,在 IPv6 更改之前,我能够通过 HTTPS 进行连接。

现在我在 Xcode 控制台中收到此错误:

---NSURLConnection/CFURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)---

我一直在阅读有关解决方法的其他帖子,但我想保持我的应用合法。它早些时候通过 HTTPS 工作,我不明白为什么 IPv6 更改会导致这种情况。我知道我可以修改应用程序传输安全密钥,但我希望它可以投入生产,而且我不想遭到 Apple 的拒绝。

它不是一个自签名证书,并且一切在手之前都是完整的。

我联系了我的服务器公司,他们不确定是什么问题。

我正在使用 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....

根据错误代码判断,我很确定您的服务器在 IPv6 模式下配置不正确,并且没有提供完整的证书链(中间证书缺失或不正确)。当然,我无法在不知道服务器名称的情况下确认这一点,但您可以通过以下方式进行检查:

openssl s_client -connect host:443

看看它说了什么。当然,如果它尝试通过 IPv4 连接...您可能必须使用 IPv6 地址而不是主机名。我从未尝试过 s_client 使用 IPv6,所以 YMMV。 :-)