【发布时间】:2016-11-08 02:58:38
【问题描述】:
我有一台使用自签名 SSL 证书进行 HTTPS 的服务器。我将自签名根证书捆绑到我的应用程序中。通过在-URLSession:didReceiveChallenge:completionHandler: 委托方法中使用SecTrustSetAnchorCertificates(),我可以让NSURLSession 使用和验证自签名根证书。
但是,当我使用 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:
Error Domain=NSURLErrorDomain Code=-1200 “发生 SSL 错误,无法与服务器建立安全连接。” UserInfo={NSLocalizedRecoverySuggestion=您还是要连接到服务器吗?, NSUnderlyingError=0x16c35720 {Error Domain=NSOSStatusErrorDomain Code=-1200 "(null)"}, NSLocalizedDescription=发生 SSL 错误,无法与服务器建立安全连接制作完成。}
如何让AVPlayer 接受 SSL 握手?
【问题讨论】:
标签: ios objective-c https ssl-certificate self-signed