2011-12-16 49 views
0

在我的应用程序中,我尝试连接到IIS服务器以访问某些服务器。 当我运行的应用程序中的iOS 4或更早的连接工作正常,但是当我在iOS 5中运行,连接返回此错误:ASIHTTPRequestErrorDomain代码1

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]; 

有人有一个想法,为什么发生这种情况?

+0

我看到你正在使用ASI。我不确定这个具体的错误,但我知道ASIHTTPRequest需要将“libz.dylib”库作为iOS 5.0项目依赖关系的一部分。 – Stavash 2011-12-16 20:52:56

回答

5

-9836是一个错误的协议错误。这可能是由于iOS 5的TLS实现升级到TLS 1.2。如果服务器不支持TLS 1.2,则可能会终止握手并且无法降级到支持的协议级别。

在ASIHTTPRequest.m变化到在下面 - (无效)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); 
    } 

}