2012-05-09 5 views
4

ASIHTTPRequest v1.8.1を使用してHTTPSリクエストを行っています。問題は、iOS 5.0 & 5.0.1では動作しませんが、5.1 & 5.1.1ではうまく動作します。コードは非常に簡単です:私はこれについて何ができるiOS 5.0/5.0.1でSSLを使用したASIHTTPリクエストが失敗しました

error = Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)" UserInfo=0x18460b0 {NSUnderlyingError=0x1853ab0 "The operation couldn’t be completed. (OSStatus error -9800.)", NSLocalizedDescription=A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)} 

__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:RemoteNotiURL]]; 
[request setPostValue:@"i" forKey:@"plat"]; 
[request setPostValue:token forKey:@"token"]; 
[request setValidatesSecureCertificate:NO]; 

[request setCompletionBlock:^{ 
    NSLog(@"done"); 
}]; 

[request setFailedBlock:^{ 
    NSLog(@"error = %@", [request error]); 

}]; 

[request startAsynchronous]; 

RemoteNotiURLhttps://xxx.example.com

エラーのようなURLがあるのですか?

+0

これに関連する可能性があります:http://stackoverflow.com/questions/7792949/ios-5-https-asihttprequest-stop-working – JosephH

答えて

13

@JosephHは、sslProperties辞書のkCFStreamSSLLevelプロパティを変更するために、ASIHTTPRequest.mを変更することを提案しました。句

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

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

たら、コメント// 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", kCFStreamSSLLevel, 
             nil]; 

     CFReadStreamSetProperty((CFReadStreamRef)[self readStream], 
           kCFStreamPropertySSLSettings, 
           (CFTypeRef)sslProperties); 
     [sslProperties release]; 
    }else { 
     NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
             [NSNumber numberWithBool:NO], kCFStreamSSLAllowsExpiredCertificates, 
             [NSNumber numberWithBool:NO], kCFStreamSSLAllowsAnyRoot, 
             [NSNumber numberWithBool:YES], kCFStreamSSLValidatesCertificateChain, 
             @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
             nil]; 

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

のようなif節を変更します。 SSL証明書を検証する両方の要求と、それを検証しない要求。

IOS 5.0.1および5.1.1でテスト済みです。

これが役に立ちます。

+2

これは私の仲間のために働く!ありがとう!私にとっても –

+0

、素晴らしい!これのために – tomsoft

+0

ありがとうございます。把握するのにしばらく時間がかかるだろう – ilyashev

関連する問題