2016-07-06 164 views
6

我有一臺使用HTTPS自簽名SSL證書的服務器。我將自簽名的根證書捆綁到我的應用程序中。我可以通過在-URLSession:didReceiveChallenge:completionHandler:委託方法中使用SecTrustSetAnchorCertificates()來獲得NSURLSession以使用和驗證自簽名根證書。如何使用帶有HTTPS和自簽名服務器證書的AVPlayer?

但是,當我使用AVPlayer嘗試此操作時,出現SSL錯誤並且播放失敗。這是我的AVAssetResourceLoader委託執行:

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

的委託被調用,並trustResult相當於kSecTrustResultUnspecified(意思是「值得信賴的,沒有明確的用戶覆蓋」),符合市場預期。然而,播放後不久出現故障,有以下AVPlayerItem.error

錯誤域= NSURLErrorDomain代碼= -1200「發生了SSL錯誤和服務器的安全連接,不能做出」 UserInfo = {NSLocalizedRecoverySuggestion =你想連接服務器嗎?,NSUnderlyingError = 0x16c35720 {錯誤域= NSOSStatusErrorDomain代碼= -1200「(空)」},NSLocalizedDescription =發生SSL錯誤,並且安全連接到服務器不能}

我怎樣才能得到AVPlayer接受SSL握手?

回答

2

這些改進也爲我工作:

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

然而,停止作爲的iOS 10.0.1的工作是有原因的,我還沒有辨別。所以這可能會對你有所幫助。祝你好運!

+0

我已經發現這實際上在設備上工作正常,但它會以奇怪和不可預知的方式在iOS模擬器中失敗,至少在iOS 9.3.x中是如此。我還沒有在iOS 10上測試過。 –

+0

同樣的問題在這裏,我的實現停止了與iOS 10一起工作,我打開了一個「技術支持事件」,試圖解決這個問題,與一些蘋果工程師。如果他們設法解決這個問題,我會在這裏發佈解決方案。 – Sylverb

+0

蘋果工程師對我的TSI的迴應:這可能是一個錯誤,我必須填寫一個雷達進一步調查。 – Sylverb

相關問題