由于不可信证书,无法通过HTTPS接收JSON请求

现在我一直在使用这个问题几个小时,我似乎无法find一个解决scheme。

我遵循的最后一个教程是本教程,解释了如何通过不可信的SSL连接发送JSON请求(本例中为自签名证书)。

总之,我迄今为止所尝试的代码是这样的:

此方法检查令牌是否对我的Web API有效:

-(BOOL)linked { if([self token] == nil) { return NO; }else { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?token=%@&object=User&action=check_authorized", SPAtajosApiLink, [self token], nil]]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; [req setHTTPMethod:@"POST"]; NSLog(@"%@", req); [req setHTTPBody: [mandatoryParameters dataUsingEncoding: NSUTF8StringEncoding]]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self]; [connection start]; NSDictionary *validity = [NSJSONSerialization JSONObjectWithData:[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil] options:NSJSONReadingMutableContainers error:nil]; NSLog(@"RESPONSE LINKED %@ %@", validity[@"code"], validity[@"message"]); } return YES; } 

我已经实现了NSURLConnectionDelegate方法,如下所示:

 - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { NSLog(@"API LINK %@", challenge.protectionSpace.host); if ([challenge.protectionSpace.host isEqualToString:SPAtajosApiLink]) { [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; } } [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } 

然而,我的应用程序总是崩溃与以下消息:

2013-10-15 22:48:58.045 Atajos [733:60b] {URL: https://MY_API_URL/www/?token=657fd6c02b3ba439e69b060f7f7680cc&object=User&action=check_authorized } 2013-10-15 22:48:58.045 Atajos [733: 3b17] NSURLConnection / CFURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)2013-10-15 22:48:58.049 Atajos [733:60b] *由于未捕获的exception“NSInvalidArgumentException”而终止应用程序,原因:'数据参数为零'*第一掷调用堆栈:(0x2ec2de8b 0x38f286c7 0x2ec2ddcd 0x2f5b5d77 0x5df9d 0x62395 0x31433025 0x3141e631 0x313b8be7 0x313b7edd 0x3141dca1 0x3389976d 0x33899357 0x2ebf877f 0x2ebf871b 0x2ebf6ee7 0x2eb61541 0x2eb61323 0x3141cf43 0x314181e5 0x62191 0x39421ab7)的libc ++ abi.dylib:与typesNSException的未捕获的exception终止

好的,所以NSData,大概NSJSONSerialization中的参数是NULL。 这个问题,为什么?

奇怪的是,我有一个类似的代码,实际上与一个UIWebView通过不可信的SSL与一个网站进行交互:

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { //Need to rebuild base URL. Otherwise I get the parameters which will always fail the check. NSURL *requestUrl = [request URL]; NSString *basicPathString = [NSString stringWithFormat:@"%@://%@:%@%@", requestUrl.scheme, requestUrl.host, requestUrl.port, requestUrl.path]; NSLog(@"%@", basicPathString); if([basicPathString isEqualToString:SPAtajosLoginLink]) { __block NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:request.URL.absoluteURL] options:NSJSONReadingMutableContainers error:nil]; NSLog(@"Auth token is %@", jsonResponse[@"token"]); [self dismissViewControllerAnimated:YES completion:^{ if([jsonResponse[@"code"] isEqualToNumber:[NSNumber numberWithInt:200]]) { [[PDKeychainBindings sharedKeychainBindings] setObject:jsonResponse[@"token"] forKey:@"com.shortcutpublicity.ios.atajos.userAccessToken"]; }else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Se Pudo Autenticar", @"Error 500 title") message:NSLocalizedString(@"Se ha producido un error interno del servidor (500). Por favor, trata de nuevo más tarde.", @"Error describing error 500") delegate:nil cancelButtonTitle:NSLocalizedString(@"Aceptar", @"Accept") otherButtonTitles:nil]; [alertView show]; } }]; }else { //--------------THIS IS THE RELEVANT PART------------ BOOL result = _Authenticated; if (!_Authenticated) { _FailedRequest = request; NSURLConnection *trash = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if(trash) { NSLog(@"Allocated succesfully."); } } return result; } return YES; } -(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { NSURL* baseURL = [NSURL URLWithString:SPatajosAuthLink]; if ([challenge.protectionSpace.host isEqualToString:baseURL.host]) { NSLog(@"trusting connection to host %@", challenge.protectionSpace.host); [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; } else NSLog(@"Not trusting connection to host %@", challenge.protectionSpace.host); } [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)pResponse { _Authenticated = YES; [connection cancel]; [_webView loadRequest:_FailedRequest]; } 

我试图适应这个代码与WebView一起工作,但我没有任何运气适应与NSURLConnection使用它。

说实话,我不太清楚我知道这些解决方法是如何工作的。 我一直在偷,并试图去适应其他人的代码无济于事。 我看了NSURLConnection和NSURLRequest文档,我无法解决这些问题。 请帮我一下

我们在#ifedf块中使用这个类别进行testing…确保你不要在生产中留下这个:

 #ifdef DEBUG @interface NSURLRequest (IgnoreSSL) +(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host; @end @implementation NSURLRequest (IgnoreSSL) +(BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host {return YES;} @end #endif 
 try this Delegate method - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { // SecTrustRef trustRef = [[challenge protectionSpace] serverTrust]; // SecTrustEvaluate(trustRef, NULL); // // SecCertificateRef certRef = SecTrustGetCertificateAtIndex(trustRef, 0); // // NSData *certificateData = (__bridge NSData *) SecCertificateCopyData(certRef); // NSLog(@"Subject: %@", [[NSString alloc] initWithData:certificateData encoding:NSUTF8StringEncoding]); // [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; SecTrustRef trust = challenge.protectionSpace.serverTrust; NSURLCredential *cred; cred = [NSURLCredential credentialForTrust:trust]; [challenge.sender useCredential:cred forAuthenticationChallenge:challenge]; }