ASIHTTPRequestErrorDomain Код 1 - PullRequest
       0

ASIHTTPRequestErrorDomain Код 1

0 голосов
/ 16 декабря 2011

В моем приложении я пытаюсь подключиться к серверу IIS для доступа к некоторым серверам.Когда я запускаю приложение в iOS 4 или более ранней версии, соединение работает нормально, но когда я запускаю в iOS 5, соединение возвращает эту ошибку:

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

это код, который я вызываю:

self.currentRequest = [ASIHTTPRequest requestWithURL:url];
[self.currentRequest setValidatesSecureCertificate:NO];
[self.currentRequest setDelegate:self];
[self.currentRequest setUsername:credentials.login];
[self.currentRequest setPassword:credentials.password];
[self.currentRequest setDomain:@"CORP"];
[self.currentRequest setUseHTTPVersionOne:YES];
[self.currentRequest setTimeOutSeconds:120];
[self.currentRequest startAsynchronous];

У кого-нибудь есть идея, почему это происходит?

1 Ответ

5 голосов
/ 20 декабря 2011

-9836 - ошибка протокола. Вероятно, это связано с тем, что реализация TLS в iOS 5 была обновлена ​​до TLS 1.2. Если TLS 1.2 не поддерживается сервером, он может прекратить рукопожатие и не сможет перейти на поддерживаемый уровень протокола.

В ASIHTTPRequest.m изменить на следующее в - (void) startRequest

//
// Handle SSL certificate settings
//

if([[[[self url] scheme] lowercaseString] isEqualToString:@"https"]) {       

    NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
                                   @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", (NSString *)kCFStreamSSLLevel,
                                   nil];

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

    // Tell CFNetwork not to validate SSL certificates
    if (![self validatesSecureCertificate]) {
        // see: http://iphonedevelopment.blogspot.com/2010/05/nsstream-tcp-and-ssl.html

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

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

    // Tell CFNetwork to use a client certificate
    if (clientCertificateIdentity) {
        NSMutableDictionary *sslProperties = [NSMutableDictionary dictionaryWithCapacity:2];

        NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:[clientCertificates count]+1];

        // The first object in the array is our SecIdentityRef
        [certificates addObject:(id)clientCertificateIdentity];

        // If we've added any additional certificates, add them too
        for (id cert in clientCertificates) {
            [certificates addObject:cert];
        }

        [sslProperties setObject:certificates forKey:(NSString *)kCFStreamSSLCertificates];
        [sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel];

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...