iphone-подключение к URL-адресу https с помощью самозаверяющего сертификата с использованием API CFNetwork - PullRequest
2 голосов
/ 30 ноября 2011

Вкратце моя проблема в том, что я пытался подключиться к URL-адресу https с помощью класса NSURLConnection и его методов делегирования.

Я получал сообщение «Произошла ошибка SSL, и не удалось установить безопасное соединение с сервером."ошибка

Итак, я реализовал это решение. Но не повезло. Эти методы делегата, указанные в решении, никогда не вызывают.

только

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
method

вызывается с вышеуказанной ошибкой

Так что я перешел на использование CFNetwork API для подключения к https URL с самозаверяющим сертификатом

А вот мой код. Я взял его с здесь и Руководство по программированию CFNetwork от apple

CFReadStreamRef readStream;
            CFHTTPMessageRef request;

            CFStringRef requestMessage = (CFStringRef)postparameters;

            request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("POST"),
                                                 (CFURLRef) postURL, kCFHTTPVersion1_1);


            CFHTTPMessageSetBody(request, (CFDataRef) requestMessage);
            readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
            CFRelease(request);

            NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
                                      [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                      [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                      [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
                                      kCFNull,kCFStreamSSLPeerName,
                                      nil];

            CFReadStreamSetProperty((CFReadStreamRef)readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);

            CFReadStreamOpen(readStream);

            /* Add to the run loop */
            CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(),
                                            kCFRunLoopCommonModes);

            if (!CFReadStreamOpen(readStream)) {
            DLog(@"method called");
            [_progressAlert dismissWithClickedButtonIndex:0 animated:YES];
            CFReadStreamSetClient(readStream, 0, NULL, NULL);
            CFReadStreamUnscheduleFromRunLoop(readStream,
                                              CFRunLoopGetCurrent(),
                                              kCFRunLoopCommonModes);
            CFRelease(readStream);
        }
        else {
        CFHTTPMessageRef myResponse =
        (CFHTTPMessageRef)CFReadStreamCopyProperty(readStream,
                                                   kCFStreamPropertyHTTPResponseHeader);
        //You can get the complete status line from the response message by calling the function CFHTTPMessageCopyResponseStatusLine:
        CFStringRef myStatusLine = CFHTTPMessageCopyResponseStatusLine(myResponse);
        DLog(@"status: %@", (NSString *)myStatusLine);

        UInt32 myErrCode = CFHTTPMessageGetResponseStatusCode(myResponse);
        NSLog(@"error :%lu", myErrCode);
        }

Вывод, который я вижу в консоли:

2011-11-30 21:02:07.720 [3800:f803][Line 180] method called

Что мне нужно добавить в мой код вышечтобы заставить его работать.

Я полагаю, это связано с аутентификацией.

Пожалуйста, помогите мне с примером кода.

Обновление: я обновил код выше и ответ.My !CFReadStreamOpen(readStream) метод возвращает true и loг печатается

...