2016-07-06 1 views
6

J'ai un serveur qui utilise des certificats SSL auto-signés pour HTTPS. J'ai le certificat root autosigné dans mon application. Je suis en mesure d'obtenir NSURLSession pour utiliser et valider le certificat racine auto-signé en utilisant SecTrustSetAnchorCertificates() dans la méthode de délégué -URLSession:didReceiveChallenge:completionHandler:.Comment puis-je utiliser un AVPlayer avec HTTPS et des certificats de serveur auto-signés?

Lorsque j'essaie ceci avec AVPlayer, cependant, j'obtiens une erreur SSL et la lecture échoue. Ceci est ma mise en œuvre AVAssetResourceLoader délégué:

- (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; 
} 

Le délégué est appelé, et le trustResult équivaut à kSecTrustResultUnspecified (ce qui signifie « de confiance, sans commande explicite de l'utilisateur »), comme prévu. Cependant, la lecture échoue peu après, avec les éléments suivants AVPlayerItem.error:

erreur Domaine = code NSURLErrorDomain = -1200 «Une erreur SSL est produite et une connexion sécurisée au serveur ne peut pas être fait » UserInfo = {NSLocalizedRecoverySuggestion = Souhaitez-vous quand même vous connecter au serveur ?, NSUnderlyingError = 0x16c35720 {Erreur domaine = NSOSStatusErrorDomain Code = -1200 "(null)"}, NSLocalizedDescription = Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être fait.}

Comment puis-je obtenir AVPlayer d'accepter la poignée de main SSL?

Répondre

2

Cette mise en œuvre a fonctionné pour moi:

- (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; 
} 

Cependant, il a cessé de fonctionner comme d'iOS 10.0.1 pour une raison que je n'ai pas encore à discerner. Cela peut vous être utile ou non. Bonne chance!

+0

J'ai depuis trouvé que cela fonctionnait bien sur un appareil, mais il échouerait de manière étrange et imprévisible _ dans le simulateur iOS, au moins dans iOS 9.3.x. Je n'ai pas encore testé sur iOS 10. –

+0

Même problème ici, mon implémentation s'est arrêtée pour fonctionner avec iOS 10, j'ai ouvert un "Technical Support Incident" pour essayer de résoudre ce problème avec un ingénieur d'Apple. S'ils parviennent à résoudre ce problème, je posterai la solution ici. – Sylverb

+0

Réponse à mon TSI de l'ingénieur d'Apple: C'est probablement un bug, je dois remplir un radar pour une enquête plus approfondie. – Sylverb