2016-07-06 20 views
6

Mam serwer, który używa samopodpisanych certyfikatów SSL dla HTTPS. Mam samopodpisany certyfikat główny dołączony do mojej aplikacji. Mogę uzyskać NSURLSession, aby użyć i zweryfikować certyfikat z podpisem własnym z podpisem SecTrustSetAnchorCertificates() w metodzie delegata .Jak mogę używać odtwarzacza AVP z certyfikatami HTTPS i certyfikatami z podpisem własnym?

Kiedy próbuję tego z AVPlayer, otrzymuję błąd SSL i odtwarzanie nie powiedzie się. To jest moja realizacja AVAssetResourceLoader delegat:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForResponseToAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge.protectionSpace.authenticationMethod isEqual:NSURLAuthenticationMethodServerTrust]) { 
     SecTrustRef trust = challenge.protectionSpace.serverTrust; 
     SecTrustSetAnchorCertificates(trust, (__bridge CFArrayRef)self.secTrustCertificates); 

     SecTrustResultType trustResult = kSecTrustResultInvalid; 
     OSStatus status = SecTrustEvaluate(trust, &trustResult); 

     if (status == errSecSuccess && (trustResult == kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed)) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:trust] forAuthenticationChallenge:challenge]; 
      return YES; 
     } else { 
      [challenge.sender cancelAuthenticationChallenge:challenge]; 
      return YES; 
     } 
    } 
    return NO; 
} 

Delegat zostanie wywołany, a trustResult przyrównuje do kSecTrustResultUnspecified (co oznacza „witryna, bez wyraźnej override użytkownika”), zgodnie z oczekiwaniami. Jednak krótko po awarii odtwarzanie z następujących AVPlayerItem.error:

Błąd Domain = kod NSURLErrorDomain = -1200 „Błąd SSL wystąpiła i bezpieczne połączenie z serwerem nie mogą być wykonane” UserInfo = {NSLocalizedRecoverySuggestion = Czy mimo to chcesz połączyć się z serwerem ?, NSUnderlyingError = 0x16c35720 {Error Domain = NSOSStatusErrorDomain Code = -1200 "(null)"}, NSLocalizedDescription = Wystąpił błąd SSL i bezpieczne połączenie z serwerem nie może być zrobione.}

Jak mogę uzyskać AVPlayer akceptację uzgadniania SSL?

Odpowiedz

2

Ta implementacja pracował dla mnie:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader 
shouldWaitForResponseToAuthenticationChallenge:(NSURLAuthenticationChallenge *)authenticationChallenge 
{ 
    //server trust 
    NSURLProtectionSpace *protectionSpace = authenticationChallenge.protectionSpace; 
    if ([protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     [authenticationChallenge.sender useCredential:[NSURLCredential credentialForTrust:authenticationChallenge.protectionSpace.serverTrust] forAuthenticationChallenge:authenticationChallenge]; 
     [authenticationChallenge.sender continueWithoutCredentialForAuthenticationChallenge:authenticationChallenge]; 
    } 
    else { // other type: username password, client trust... 
    } 
    return YES; 
} 

Jednak przestał działać jak iOS 10.0.1 z jakiegoś powodu mam jeszcze rozeznania. To może ci pomóc lub nie. Powodzenia!

+0

Od tamtej pory okazało się, że to działa poprawnie na urządzeniu, ale nie zadziałałoby w dziwny i nieprzewidywalny sposób - na symulatorze iOS, przynajmniej w iOS 9.3.x. Nie testowałem jeszcze na iOS 10. –

+0

Ten sam problem tutaj, moja implementacja przestała działać z iOS 10, otworzyłem "Incydent pomocy technicznej", aby spróbować rozwiązać ten problem u jakiegoś inżyniera Apple. Jeśli uda im się rozwiązać ten problem, opublikuję rozwiązanie tutaj. – Sylverb

+0

Odpowiedź na moją TSI od inżyniera Apple: To prawdopodobnie błąd, muszę wypełnić radar w celu dalszego zbadania. – Sylverb

Powiązane problemy