Ios 如何让AVPlayer检索受SSL保护的播放列表?

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

我们正在开发一个HTTP流式iOS应用程序,它要求我们从安全站点接收播放列表。此站点要求我们使用自签名SSL证书进行身份验证

在使用NSURLConnection和委托对授权质询作出反应之前,我们从.p12文件中读取凭据

- (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-是的,它会。否则加密密钥和其他东西就没什么用处了!