iOS 5: перестает работать https (ASIHTTPRequest) - PullRequest
9 голосов
/ 17 октября 2011

У меня есть приложение, которое использует ASIHTTPRequest .

I перекомпилировал мое приложение с iOS 5 (sdk: 5.0 / xcode: 4.2 Build 4D199) и https не удается установить соединение с сообщением об ошибке (тот же вызов с отключенным https работает нормально ):

Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xa8e66e0 {NSUnderlyingError=0xa8ac6c0 "The operation couldn’t be completed. (OSStatus error -9844.)", NSLocalizedDescription=A connection failure occurred}

С включенным журналом отладки:

[STATUS] Starting asynchronous request <ASIFormDataRequest: 0xd96fc00>

[CONNECTION] Request <ASIFormDataRequest: 0xd96fc00> will not use a persistent connection

[STATUS] Request <ASIFormDataRequest: 0xd96fc00>: Failed

[CONNECTION] Request #(null) failed and will invalidate connection #(null)

Я нашел этот пост: https://devforums.apple.com/message/537440#537440 что могло бы объяснить мою проблему.

исходя из идеи, что iOS 5 предпочитает TLS 1.2, я пытаюсь изменить параметр kCFStreamSocketSecurityLevelTLSv1 в AIHTTPRequest.m

  NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                     [NSNumber numberWithBool:YES],
kCFStreamSSLAllowsExpiredCertificates,
                                     [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                     [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                     kCFNull,kCFStreamSSLPeerName,
                                      kCFStreamSocketSecurityLevelTLSv1, kCFStreamSSLLevel,// my modif
                                     nil];

безуспешно. Может быть, моя модификация неверна?

подробности:

  • Я отключил ARC
  • Я использую libz.1.2.5.dylib
  • Я обновил ASIHTTPRequest неделю назад.

Я не знаю, является ли проблема историей сертификата (например, версия TLS) или чем-то еще.

любая помощь / идея приветствуется!

Ответы [ 5 ]

6 голосов
/ 09 марта 2012

Вот окончательное решение:

https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

        NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                       [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                       [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                       [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                       kCFNull,kCFStreamSSLPeerName,
                                       @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
                                       nil];

Добавление этого параметра:

                                       @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
6 голосов
/ 02 декабря 2011

В нашей настройке проблема была исправлена ​​путем вставки

[sslProperties setObject:(NSString *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel];

чуть выше

CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties);

в разделе Настройки сертификата SSL для обработки.

РЕДАКТИРОВАТЬ: Согласно http://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309 следующее должно быть более устойчивым

[sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel];
5 голосов
/ 21 октября 2011

похоже, что запрос ASIHTTPRequest отменяется.и текущая версия получила ошибку с iOS 5.

http://groups.google.com/group/asihttprequest/browse_thread/thread/7731197dbe71c260

они рекомендуют перейти на NSURLConnection.

1 голос
/ 20 ноября 2011

Попробуйте использовать kCFStreamSocketSecurityLevelSSLv3 вместо TLSv1.Это сработало для меня, когда я столкнулся с подобной ситуацией.Я не уверен, почему автоматическое согласование не возвращается к правильному протоколу, но, по крайней мере, на некоторых серверах оно завершается с ошибкой в ​​ASIHttpRequest, где оно будет работать с NSURLConnection.

1 голос
/ 17 октября 2011

Вот те вещи, которые я бы попробовал:

  1. Загрузите свежую копию asihttprequest, поместите ее во вновь созданное очень простое приложение, которое просто создает один http и посмотрите, ведет ли он себя так же
  2. Попробуйте на других серверах https проверить, не происходит ли такое же поведение (попробуйте использовать некоторые из громких имен, например, https://twitter.com - linkedin, google и т. Д., Все они также имеют версии https)
  3. Попробуйте тот же сервер в Safari (все еще на устройстве iOS)

Для чего бы то ни было, у меня ASIHTTPRequest на iOS5 работает нормально с серверами https моего клиента - мне не нужно было делать какие-либоизменения для iOS5.

...