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?
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. –
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
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