Ios 如何让AVPlayer检索受SSL保护的播放列表?
我们正在开发一个HTTP流式iOS应用程序,它要求我们从安全站点接收播放列表。此站点要求我们使用自签名SSL证书进行身份验证 在使用NSURLConnection和委托对授权质询作出反应之前,我们从.p12文件中读取凭据Ios 如何让AVPlayer检索受SSL保护的播放列表?,ios,ipad,ssl,avplayer,http-live-streaming,Ios,Ipad,Ssl,Avplayer,Http Live Streaming,我们正在开发一个HTTP流式iOS应用程序,它要求我们从安全站点接收播放列表。此站点要求我们使用自签名SSL证书进行身份验证 在使用NSURLConnection和委托对授权质询作出反应之前,我们从.p12文件中读取凭据 - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { [[challe
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
[[challenge sender] useCredential: self.credentials forAuthenticationChallenge:challenge];
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
return YES;
}
通过与我们获取.m3u8播放列表的URL进行初始连接,我们可以使用AVPlayer播放播放列表。问题是这种方法只能在模拟器中工作
注意:我们可以使用设备上的NSURLConnection下载播放列表。这一定意味着AVPlayer无法继续使用在初始连接期间建立的信任
我们还尝试在没有任何运气的情况下将凭据添加到[nsurCredentialStorage sharedCredentialStorage]
以下是我们的猎枪方法:
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
initWithHost:host
port:443
protocol:@"https"
realm:nil
authenticationMethod:NSURLAuthenticationMethodClientCertificate];
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:creds
forProtectionSpace:protectionSpace];
NSURLProtectionSpace *protectionSpace2 = [[NSURLProtectionSpace alloc]
initWithHost:host
port:443
protocol:@"https"
realm:nil
authenticationMethod:NSURLAuthenticationMethodServerTrust];
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:creds
forProtectionSpace:protectionSpace2];
编辑:根据:上述方法不适用于证书
欢迎任何关于它为什么不能在设备上工作的提示,或者其他解决方案 看来,在苹果让我们控制AVPlayer使用的NSURLConnections之前,唯一的答案似乎是实现HTTP环回服务器 引用回答我们支持问题的苹果代表的话: 另一种选择是实现环回 HTTP服务器和该位置的点客户端对象。客户可以使用 HTTP(因为他们的请求从未离开设备),而 环回HTTP服务器本身可以使用HTTPS连接到源站 服务器。同样,这使您能够访问底层 NSURLConnections,允许您进行自定义服务器信任评估 除非您 完全控制源服务器上的内容。如果来源 服务器可以返回任意内容,您必须通过 返回HTTP并重写所有链接,这不是什么有趣的事情。A. 类似的限制适用于MPMoviePlayerController/AVPlayer,但 在这种情况下,控制所有内容和 因此可以避免非相对链接 编辑: 我使用的自定义实现实现了一个环回服务器 在中找到HTTPResponse和HTTPConnection类 我不能透露源代码,但我将NSURLConnection与AsyncHTTPResponse和DataHTTPResponse演示响应结合使用 编辑: 记住设置myHttpServerObject.interface=@“环回”代码> 编辑:警告!!!这种方法似乎不适用于airplay,因为airplay设备将向127.1.1.1请求加密密钥。这里似乎定义了正确的方法: “使用应用程序定义的URL方案指定.m3u8文件中的键。” 编辑:
苹果电视和iOS更新解决了上述编辑中提到的问题从iOS 6开始,AVAssetResourceLoader可用于检索HTTPS安全播放列表或密钥文件 AVAssetResourceLoader对象将来自AVURLAsset对象的资源请求与您提供的委托对象进行调解。当请求到达时,资源加载器会询问您的代理是否能够处理该请求,并将结果报告回资产 请在下面找到示例代码
// AVURLAsset + Loader
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVAssetResourceLoader *loader = asset.resourceLoader;
[loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
// AVPlayer
AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
您将需要处理resourceLoader:ShouldWaitForLoadingFrequestedResource:delegate方法,当需要身份验证时将调用该方法,您可以使用NSURLConnection请求安全资源
(BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
{
//Handle NSURLConnection to the SSL secured resource here
return YES;
}
希望这有帮助
注意:使用CocoaHTTPServer的代理方法工作得很好,但使用AVAssetResourceLoader是一个更优雅的解决方案。根据这个问题:NSURLCredentialStorage不适用于证书。我想情况仍然如此。我试图模仿你的技术,但我撞到了墙。您如何保护本地服务器和应用程序之间的通信?有了HTTP和越狱的iOS设备,用tcpdump捕获流量就很简单了。要使用HTTPS,您需要AVPlayer将接受的证书(必须由设备的根证书颁发机构之一颁发)。我们没有保护本地服务器和应用程序之间的通信。我们开发此应用程序的客户非常清楚,一个专门的黑客可能会破坏安全。这就是为什么他们将来要升级到第三方媒体播放器供应商的原因。在苹果让我们控制AVPlayer使用的NSURLConnections之前,唯一的答案似乎是实现HTTP环回服务器。iOS5仍然如此吗?是的,我想是这样。这就是有多少DRM库可以工作。不过,我还没有更新iOS6和iOS7中的新视频功能。上面的内容是否仍然准确?现在不应该在.plist中“允许任意加载”使用自签名证书处理对服务器的身份验证吗?谢谢您的更新!我很久以前就搬到了不同的牧场,但这对其他人来说非常有用。如果你使用“https”方案,它会被调用吗?@Timur-是的,它会。否则加密密钥和其他东西就没什么用处了!