«сертификат недоверенного сервера» на iPhone - PullRequest
5 голосов
/ 05 июля 2010

Я пишу приложение для iPhone и хотел бы подключиться к серверу HTTPS, чтобы получить некоторую информацию. Тем не менее, я получаю ошибку в консоли, которая

NSUnderlyingError = Ошибка домена = kCFErrorDomainCFNetwork Code = -1202 UserInfo = 0x3e95cf0 "Сертификат для этого сервера недействителен. Вы может подключаться к серверу, который притворяется «example.com» что может поставить под угрозу вашу конфиденциальную информацию. ";}

Как я могу доверять сертификату и получить http код состояния 200

Вот мой код.

    NSMutableURLRequest *request_get2 = [[[NSMutableURLRequest alloc] init] autorelease];
    [request_get2 setURL:[NSURL URLWithString:@"https://www.example.com"]]; 
    [request_get2 setHTTPMethod:@"GET"];
    [request_get2 setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    //[request_get2 setValue:@"text/html; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    [request_get2 setValue:@"https://www.example.com" forHTTPHeaderField:@"Referer"];
    [request_get2 setHTTPShouldHandleCookies:YES];
    // cookiesString is in format "cookieName=cookieValue;"
    [request_get2 setValue: (NSString *) cookiesString forHTTPHeaderField:@"Cookie"];


    // doGet - response
    NSHTTPURLResponse *response_get2 = nil;  // it change from 'NSURLRespaonse' to 'NSHTTPURLResponse'
    NSError *error_get2 = nil;
    NSData *responseData_get2 = [NSURLConnection sendSynchronousRequest:request_get2 returningResponse:&response_get2 error:&error_get2];
    NSString *data_get2 = [[NSString alloc]initWithData:responseData_get2 encoding:NSUTF8StringEncoding];

    if (!error_get2) {
        NSString *responseURL_get2 = [[response_get2 URL] absoluteString];           // null value
        NSString *responseTextEncodingName_get2 = [response_get2 textEncodingName];  // null value
        NSString *responseMIMEType_get2 = [response_get2 MIMEType];                  // null value
        NSUInteger *responseStatusCode_get2 = [response_get2 statusCode]; //[responseStatusCode intValue]; // the status code is 0
    }
    else {
        NSLog(@"\nsomething went wrong: %@\n", [error_get2 userInfo]); // got the error in here
    }

Ответы [ 2 ]

11 голосов
/ 05 июля 2010

Я думаю, что добавить ненадежный сертификат (по крайней мере, в симуляторе) невозможно, но вы можете сказать своему NSURLConnection Delegate принять самозаверяющие сертификаты (или вообще ненадежные)

Следующая ссылка помогла мне решить проблему!

Как использовать NSURLConnection для соединения с SSL для ненадежного сертификата?

0 голосов
/ 19 января 2015

Доверять всем сертификатам - очень плохая идея. Злоумышленник может выполнить Man-in-the-Middle атаку на ваших пользователей, чтобы прочитать или изменить все переданные данные.

Я считаю, что ваш сертификат не содержит всех промежуточных сертификатов, необходимых для проверки пути к доверенному корневому сертификату системы. Некоторые инструменты проверки конфигурации SSL могут сообщать о неполной цепочке сертификатов .

Вы можете решить проблему неполная цепочка сертификатов вручную, объединив все сертификаты от сертификата до доверенного корневого сертификата (исключительно в этом порядке), чтобы предотвратить такие проблемы. Обратите внимание, что доверенный корневой сертификат не должен быть там, поскольку он уже включен в хранилище корневых сертификатов системы.

Вы должны быть в состоянии получить промежуточные сертификаты от эмитента и объединить их вместе. Я написал скрипт для автоматизации процедуры, он требует сертификат для выдачи правильных цепочек сертификатов. https://github.com/zakjan/cert-chain-resolver

...