不久前,我使用了我的一个 Apple 技术支持问题。这是对话:
大卫
我正在回答您关于 iOS 上受信任的根证书的问题。你写了:
所以问题是:是否可以查询设置应用程序/或已安装的配置文件以确定是否安装了特定证书。
您可以通过使用信任对象 (SecTrustRef) 来评估特定证书是否受系统信任来执行此操作。我最近发表了一篇技术说明,深入讨论了这个整体问题。在阅读我的其余回复之前,您应该阅读此内容。
TN2232《HTTPS 服务器信任评估》
http://developer.apple.com/library/ios/#technotes/tn2232/_index.html
该技术说明没有涵盖您的具体情况,但它相对容易适应它描述的技术来解决您的问题。基本策略是:
查找由证书颁发机构颁发的证书——您可以从网站本身获取此证书(使用电影的 HEAD 请求),或者您可以将其嵌入到您的应用程序中。
如果您有证书数据,请从中创建一个证书对象 (SecCertificateRef) -- 您使用 SecCertificateCreateWithData 来执行此操作。
从中创建一个信任对象——您使用 SecTrustCreateWithCertificates 来执行此操作。您必须提供一个策略对象 (SecPolicyRef),但创建其中一个很容易:只需调用 SecPolicyCreateBasicX509。
评估信任对象——您使用 SecTrustEvaluate 执行此操作。如果它返回 kSecTrustResultProceed 或 kSecTrustResultUnspecified,则系统信任颁发您在步骤 1 中开始的证书的证书颁发机构的根证书;如果它返回任何其他内容,则通过 HTTPS 播放电影很可能会失败。
此外,我们是否甚至必须离开应用程序才能安装证书?
是的,尽管您可以通过更改电影播放的方式来完全避免这个问题。我将在下面更详细地讨论这一点。
证书可以以某种方式安装在钥匙串中[...]
是的,但这不会导致系统(甚至您的应用程序)信任由该根证书颁发的证书。在某些情况下,向钥匙串添加证书很有用(例如,如果它是数字身份的一部分,或者是中间证书),但它对 HTTPS 服务器信任评估没有帮助。
* * *
以上所有假设您正在通过渐进式下载播放电影。如果您的电影使用 HTTP Live Streaming(这是我们通常推荐的),则有 /much/ 更好的方法来解决此问题。TN2232 的“HTTP Live Streaming”部分介绍了这个想法,并有更详细的信息参考。
这种方法提供了许多非常重要的优点:
o 它避免了安装自定义根证书的需要。
o HTTP Live Streaming 通常会产生更好的播放效果,因为系统会自动适应可用带宽的变化。
o 如果您提供低带宽流 App Review 将允许您通过 WWAN 播放电影。
o 您的媒体片段已加密,因此您可以将它们移动到 HTTP 服务器(而不是 HTTPS 服务器)。这可以显着减少内容分发网络的负载。
我强烈建议您调查此选项。
如果您对此主题有任何其他问题,请告诉我。
奎因“爱斯基摩人!”