2016-07-06 26 views
6

HTTPS için kendinden imzalı SSL sertifikaları kullanan bir sunucum var. Uygulamamda kendim imzalı kök sertifika var. NSURLSession, -URLSession:didReceiveChallenge:completionHandler: delege yönteminde SecTrustSetAnchorCertificates() kullanarak kendinden imzalı kök sertifikayı kullanmak ve doğrulamak için alabiliyorum.HTPPS ve kendinden imzalı sunucu sertifikalarıyla AVPlayer'ı nasıl kullanabilirim?

Bunu, AVPlayer ile denediğimde, bir SSL hatası alıyorum ve oynatma başarısız oluyor. Bu benim AVAssetResourceLoader temsilci uygulamasıdır:

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

temsilci çağrılır ve trustResult beklendiği gibi ("açık kullanıcı kodları olmadan, güvenilir" anlamına gelir) kSecTrustResultUnspecified eşittir.

Hata Alan = NSURLErrorDomain Kodu = -1200 "Bir SSL hata oluştu ve sunucuya güvenli bağlantı yapılamaz": Ancak, oynatma AVPlayerItem.error aşağıdaki kısa bir süre sonra başarısız UserInfo = {NSLocalizedRecoverySuggestion = Sunucuya yine de bağlanmak ister misiniz ?, NSUnderlyingError = 0x16c35720 {Hata Etki Alanı = NSOSStatusErrorDomain Code = -1200 "(null)"}, NSLocalizedDescription = SSL hatası oluştu ve sunucuya güvenli bir bağlantı kurulamadı }

SSL el sıkışmasını kabul etmek için AVPlayer nasıl edinebilirim?

cevap

2

Bu uygulama benim için çalışıyor:

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

Ancak ben ayırt henüz bir sebeple iOS 10.0.1 itibariyle çalışmayı durdurdu. Yani bu size yardımcı olabilir veya olmayabilir. İyi şanslar!

+0

Bunun aslında bir aygıtta iyi çalıştığını anladım, ancak iOS simulator_'ında, en azından iOS 9.3.x sürümünde tuhaf ve öngörülemeyen şekillerde başarısız olur. IOS 10'da henüz test olmadım. –

+0

Burada aynı sorun, benim uygulama iOS 10 ile çalışmak için durdu, bazı Apple mühendis ile çözmek için bir "Teknik Destek Olayı" açtım. Bu sorunu çözmeyi başarırsa, çözümü buraya gönderirim. – Sylverb

+0

Apple'ın mühendisinden TSI'mın cevabı: Muhtemelen bir böcek, daha fazla araştırma için bir radarı doldurmalıyım. – Sylverb

İlgili konular