2015-08-06 2 views
1

Я пытаюсь отправить сообщение на сервер, поддерживающий TLS 1.2 - по крайней мере, когда я выполняю GET в браузере, я могу проверить, что связь использует TLS 1.2 и что сертификат проверен уполномоченным органом. Однако, когда я пытаюсь выполнить POST в моем коде на этом сервере, используя AFNetworking iOS 9.0 (13A4305g)/Xcode 7-beta4, я получаю отказ от рукопожатия.Хост поддерживает TLS 1.2, сбой установления связи AFNetworking

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.requestSerializer = [AFHTTPRequestSerializer serializerWithContentType:@"application/x-www-form-urlencoded"];  
manager.responseSerializer = [AFJSONResponseSerializer serializer];  
[manager POST:requestString parameters:@{ @"apiKey" : MY_API_KEY, 
              @"payload" : [MyParams paramsForPOSTAsJSON] } 
    success:^(AFHTTPRequestOperation *operation, NSDictionary *responseDict) { 
     ... 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     myLog(@"Communication failed: %@", error); 
}]; 

Неудача:

2015-08-06 15:01:08.398 MyApp[1795:394055] CFNetwork SSLHandshake failed (-9824) 
2015-08-06 15:01:08.409 MyApp[1795:394055] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824) 
2015-08-06 15:01:08.412 MyApp[1795:393999] MyClass sendDataToServer Communication failed: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." ... 

ли я что-то отсутствует? Как я могу копать глубже? Предположим, что это проблема с сервером, а не с кодом - как я могу его обмануть?

+0

Это может быть связано с http://stackoverflow.com/questions/31820284/ssl-ios9-sslhandshake-failed-i-checked-with-openssl-my-server-works-with-tls, где проблема заключалась в том, что iOS9 необходимо не только TLS1.2, но и специальные шифры (прямая секретность). –

+0

@SteffenUllrich Это выглядит очень многообещающим. Насколько я могу судить, на сайте, на котором я наносил удар, не хватает всех необходимых шифров. Я посмотрю, что произойдет, как только я это выясню. –

ответ

8

Штеффен привел меня к ответу, и действительно, мне нужны были соответствующие шифры. Простым способом просмотра поддерживаемых шифров на порту является cipherscan tool. Шифры, поддерживаемые для безопасности приложений на транспорте can be found here. Как только я смог протестировать на полностью настроенном веб-сайте, мне не нужен какой-либо белый список. Для сайтов TLS без шифров я могу установить NSThirdPartyExceptionRequiresForwardSecrecy на false.

UPDATE

Если взять бета-3 или выше ОС X El Capitan, вы можете использовать следующую команду:

Это скажет вам, что данные, которые вы должны были бы добавить ваш белый список, чтобы сделать соединение успешным. Это отличная помощь в демистификации сбоев SSL типа CFNetwork SSLHandshake failed (-9801).

+0

Также обратите внимание на то, что: «Сертификаты должны использовать, по крайней мере, отпечаток SHA256 с ключом RSA 2048 бит или более, или ключ с эллиптической кривой (ECC) размером 256 бит или больше». –

+0

Может ли клиент iOS отключить ATS и все еще подключиться к серверу TLS 1.2? Мое приложение еще не готово для ATS, но сервер back-end настроен на TLS 1.2, когда клиент подключается к серверу для процесса авторизации, веб-сервер сгенерировал билет и отправил его обратно клиенту iOS, однако, когда я использовать один и тот же билет для последующего вызова на задний сервер, билет не может быть распознан сервером. Когда я сравниваю билет клиента iOS с билетом Windows API Tester (это работает), клиентский билет iOS намного короче. Извините, я новичок. – Aviva

Смежные вопросы