2016-09-20 6 views
1

и спасибо заранее.Приложение iOS неожиданно не может подключаться через HTTPS после изменения IPv6

Все отлично работает в моем приложении, которое по сути является полным. Приложение было завершено, и пользовательский сервер VPS был настроен как сервер. Затем, прочитав рекомендации Apple Submission, я убедился, что мой сервер совместим с IPv6.

Теперь я не могу подключиться к своему серверу через HTTPS. Он подключается через HTTP по-прежнему (если я вернусь и изменил URL-адреса). Кроме того, я смог подключиться через HTTPS до изменения IPv6.

Теперь я получаю эту ошибку в консоли 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.... 
+0

Ваш код выглядит довольно просто. Я бы попросил рассказать на веб-сайте StackOverflow serverfault.com, как проверить правильность и правильность настройки IPv6 + TLS. –

ответ

1

Судя по коду ошибки, я уверен, что ваш сервер настроен неправильно в режиме IPv6 и не обслуживает всю цепочку сертификатов (отсутствует или неправильные промежуточные сертификаты). Я не могу подтвердить, что, конечно же, не зная имя сервера, но вы можете проверить его:

openssl s_client -connect host:443 

и посмотреть, что он говорит. Конечно, если он пытается подключиться по IPv4 ... вам может потребоваться использовать IPv6-адрес вместо имени хоста. Я никогда не пробовал s_client с IPv6, поэтому YMMV. :-)

+0

Я ценю ваш ответ. Я сейчас изучу эти вещи и вернусь к вам. Создает ли VPS для IPv6 что-то, что проходит каждый, или я делаю что-то ненужное в первую очередь. Я имею в виду, я видел это в Руководстве по подаче Apple, но похоже, что это не тема, которую многие люди обсуждают. – ARENV

+0

Я выполнил команду, как вы и предполагали. Я получаю следующую ошибку: «getaddrinfo: имя или услуга неизвестны. Connect: errno = 2» – ARENV

+0

Технически ваш сервер не поддерживает * IPv6. Когда iOS 10 получает ответ только на IPv4, он будет прозрачно создавать специальный адрес, который маршрутизирует трафик через туннель IPv4-over-IPv6. Конечно, вы должны протестировать свое приложение, чтобы убедиться, что оно работает в этой среде. – dgatwood