2013-02-15 8 views
8

私はhttpsを使用してウェブサービスをリクエストするのに苦労しています。この種のエラーが発生します:SSLによるウェブサービスへのリクエスト

An error occured : The certificate for this server is invalid. You might be connecting to a server that is pretending to be “SERVER_ADDRESS” which could put your confidential information at risk. 

私はNSUrlConnectionDelegateを使用していません。ここに私の方法です:

- (void)sendRequestWithUrl:(NSURL*)url block:(void (^)(NSDictionary *dict, NSError *error)) block{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    NSError* err = nil; 
    NSHTTPURLResponse* rsp = nil; 
    // Perform the request synchronously on this thread 
    NSData *rspData = [NSURLConnection sendSynchronousRequest:request returningResponse:&rsp error:&err]; 
    if (rspData && err == nil) { 
     NSDictionary *result = [NSJSONSerialization JSONObjectWithData:rspData options:NSJSONReadingMutableLeaves error:&err]; 
     if(result) { 
      block(result, err); 
     } else { 
      block(nil, err); 
     } 
    }else{ 
     DLog(@"Requesting URL: %@ An error occured : %@",url,[err localizedDescription]); 
     block(nil, err); 
    } 
} 

私はこの問題を解決できましたか?

+1

自己署名証明書に問題があるようです。正しいのですか? [AFNetworking](https://github.com/AFNetworking/AFNetworking/blob/master/README.md)や[MKNetworking](https://github.com/MugunthKumar/MKNetworkKit)などのlibに変更することをお勧めします。 /blob/master/README.mdown)、これらの問題を扱いやすくします。チェック:http://stackoverflow.com/questions/13077753/need-to-view-website-with-a-self-signed-certificate-and-http-authentication –

+1

また、可能な複製:http:// stackoverflow。 com/questions/933331/how-to-use-nsurl-connected-with-with-untrusted-cert –

+1

私は他のライブラリを使いたくありません。また、他の質問解決策では省略されている – Streetboy

答えて

1

を使用することにより、あなたはあなたのコミュニケーションクラスにデリゲートメソッドの下に追加する必要があります。

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     if ([YOUR_HOST isEqualToString:challenge.protectionSpace.host]) 
     { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];   
     } 
    } 
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 
} 
0

これは常に自己署名証明書のために起こります。 NSURLConnectionDelegate

- (BOOL)connection:(NSURLConnection *)connection 
canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    if ([protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     return YES; 
    } 
} 
+0

このコードはどのように調整できましたか?私はNSURLConnectionDelegateでそれを行う方法を知っているが、ブロックを使用してそれを行う方法 – Streetboy

+0

なぜあなたはNSURLConnectionDelegateを使いたくないのですか?あなたのコードを壊すことは何ですか? –

+0

私は現在のコードを更新したいと思います。なぜなら、他の方法では、すべてがブロックで行われているので、たくさんの変更を加える必要があるからです。また、私はこのアプローチでコードを書くのが好きです – Streetboy

0

このデリゲートメソッドを試してみると、同じ問題が解決しました。

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { 
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 
2

まあ私の解決策は、私がhttp://stackoverflow.comでどこか見つかりましたが、今それを見つけることができません。このコードをクラスAsyncURLConnectionを作成することでした。だから私は、コードを提供します:

AsyncURLConnection

ので、いくつかのコントローラでは、このクラスを使用することができる

の.h

#import <Foundation/Foundation.h> 

typedef void (^completeBlock_t)(NSData *data); 
typedef void (^errorBlock_t)(NSError *error); 

@interface AsyncURLConnection : NSObject{ 
    NSMutableData *data_; 
    completeBlock_t completeBlock_; 
    errorBlock_t errorBlock_; 
} 

+ (id)request:(NSString *)requestUrl completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock; 
- (id)initWithRequest:(NSString *)requestUrl completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock; 
+ (id)requestWithMutable:(NSMutableURLRequest *)request completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock; 
- (id)initWithMutableRequest:(NSMutableURLRequest *)request completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock; 
@end 

.M

#import "AsyncURLConnection.h" 

@implementation AsyncURLConnection 

+ (id)requestWithMutable:(NSMutableURLRequest *)request completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock 
{ 
    return [[self alloc] initWithMutableRequest:request completeBlock:completeBlock errorBlock:errorBlock]; 
} 

+ (id)request:(NSString*)requestUrl completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock 
{ 
    return [[self alloc] initWithRequest:requestUrl 
          completeBlock:completeBlock errorBlock:errorBlock]; 
} 

- (id)initWithRequest:(NSString *)requestUrl completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock 
{ 
    if ((self=[super init])) { 
     data_ = [[NSMutableData alloc] init]; 
     completeBlock_ = [completeBlock copy]; 
     errorBlock_ = [errorBlock copy]; 
     NSURL *url = [NSURL URLWithString:requestUrl]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
     [NSURLConnection connectionWithRequest:request delegate:self]; 
    } 
    return self; 
} 

- (id)initWithMutableRequest:(NSMutableURLRequest *)request completeBlock:(completeBlock_t)completeBlock errorBlock:(errorBlock_t)errorBlock 
{ 
    if ((self=[super init])) { 
     data_ = [[NSMutableData alloc] init]; 
     completeBlock_ = [completeBlock copy]; 
     errorBlock_ = [errorBlock copy]; 
     [NSURLConnection connectionWithRequest:request delegate:self]; 
    } 
    return self; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [data_ setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [data_ appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    completeBlock_(data_); 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    errorBlock_(error); 
} 


- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if ([challenge previousFailureCount] == 0) 
    { 
     NSURLCredential *newCredential; 
     newCredential=[NSURLCredential credentialWithUser:@"someUser" 
               password:@"someUser" 
               persistence:NSURLCredentialPersistenceForSession]; 
     [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     DLog(@"responded to authentication challenge"); 

    }else{ 
     DLog(@"previous authentication failure"); 
    } 
} 

+ (void) downloadFileForURL:(NSURL *) url completionBlock:(void (^)(NSData *data, NSError *error)) block { 
    NSString *requestURL = @"https://www.google.lt/restServer/Method"; 
    [AsyncURLConnection request:requestURL completeBlock:^(NSData *data) { 
     /* success! */ 
     dispatch_queue_t downloadQueue = dispatch_queue_create("Download queue", NULL); 
     dispatch_async(downloadQueue, ^{ 
      /* process downloaded data in Concurrent Queue */ 
      if (data != nil) { 
       block(data, nil); 
      }else{ 
       block(nil,nil); 
      } 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       /* update UI on Main Thread */ 
      }); 
     }); 
    } errorBlock:^(NSError *error) { 
     /* error! */ 
     block(nil,error); 
    }]; 
} 

このコードが役立ちますようお願いいたします。

ありがとうございました。

関連する問題