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

Linqpad - я все время так использую. http://www.linqpad.net/

Не вводите в заблуждение название - оно просто описывает первоначальную мотивацию, а не его функциональность.

Совсем недавно он выпустил версию с правильным завершением выписки - это платное дополнение (основной инструмент бесплатный), но, думаю, за небольшую сумму денег, и оно того стоит.

299
задан soulshined 12 September 2015 в 05:53
поделиться

5 ответов

Для этого есть поддерживаемый API! Добавьте что-нибудь подобное к вашему делегату NSURLConnection:

- (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])
    if ([trustedHosts containsObject:challenge.protectionSpace.host])
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

  [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

Обратите внимание, что соединение:didReceiveAuthenticationChallenge: может отправить свое сообщение на challenge.sender (намного позже), после представления диалогового окна пользователю, если это необходимо, и т.д.

415
ответ дан 23 November 2019 в 01:29
поделиться

NSURLRequest имеет частный метод под названием setAllowsAnyHTTPSCertificate: forHost: , который будет делать именно то, что вам нужно. Вы можете определить метод allowAnyHTTPSCertificateForHost: для NSURLRequest через категорию и установить его так, чтобы он возвращал YES для хоста, который вы хотите переопределить.

]
12
ответ дан 23 November 2019 в 01:29
поделиться

Если вы не желаете (или не можете) использовать частные API, существует библиотека с открытым исходным кодом (лицензия BSD) под названием ASIHTTPRequest , которая предоставляет оболочку для нижнего уровня API сети CFNetwork . Недавно они представили возможность разрешать HTTPS-соединения с использованием самоподписанных или ненадежных сертификатов с помощью API -setValidatesSecureCertificate: . Если вы не хотите использовать всю библиотеку, вы можете использовать исходный код в качестве справочника для самостоятельной реализации тех же функций.

36
ответ дан 23 November 2019 в 01:29
поделиться

Я не могу взять на себя ответственность за это, , но тот, который я нашел , очень хорошо подходит для моих нужд. shouldAllowSelfSignedCert - моя переменная BOOL . Просто добавьте к своему делегату NSURLConnection , и вы должны быть готовы к быстрому обходу для каждого соединения.

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)space {
     if([[space authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {
          if(shouldAllowSelfSignedCert) {
               return YES; // Self-signed cert will be accepted
          } else {
               return NO;  // Self-signed cert will be rejected
          }
          // Note: it doesn't seem to matter what you return for a proper SSL cert
          //       only self-signed certs
     }
     // If no other authentication is required, return NO for everything else
     // Otherwise maybe YES for NSURLAuthenticationMethodDefault and etc.
     return NO;
}
10
ответ дан 23 November 2019 в 01:29
поделиться

Обходной путь категории, опубликованный Натаном де Вризом, пройдет проверку приватного API AppStore и будет полезен в случаях, когда вы не контролируете объект NSUrlConnection. Одним из примеров является NSXMLParser, который откроет предоставленный вами URL, но не раскрывает NSURLRequest или NSURLConnection.

В iOS 4 обходной путь, похоже, все еще работает, но только на устройстве, симулятор больше не вызывает метод allowsAnyHTTPSCertificateForHost:.

6
ответ дан 23 November 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: