2012-03-30 132 views
3

我发现下面的代码:https://github.com/roddi/ValidateStoreReceipt/blob/master/validatereceipt.m这在MacOS访问苹果的根证书在iOS

加载根证书(“苹果根CA”),我试图使它在iOS上正常工作。

我们的代码是用C++编写的,使用OpenSSL在使用SSL套接字时验证远程对等体。

在其他平台上,我们加载根证书并使用X509_STORE_add_cert将它们添加到上下文中。

然后我们使用SSL_get_peer_certificate并验证主机名。这些不是自签名证书,这就是我们为什么要使用设备的根证书的原因。

我的问题是如何获得iOS设备上的根证书?

编辑:

我试过下面的查询,但我不断收到-25300(errSecItemNotFound)。

NSDictionary* query=[NSDictionary dictionaryWithObjectsAndKeys: 
        (__bridge id)kSecClassCertificate,kSecClass, 
        kCFBooleanTrue,kSecReturnRef, 
        kSecMatchLimitAll,kSecMatchLimit, 
        kCFBooleanTrue,kSecMatchTrustedOnly, 
        nil]; 
SecItemCopyMatching((__bridge CFDictionaryRef)query,&ref); 

回答

3

你会想要的东西沿着这些线路:

  • kSecMatchTrustedOnly组查找使用SecItemCopyMatching()的证书kCFBooleanTrue。记住,这将是a lot of certificates,而不只是一个。
  • 然后使用SecCertificateCopyData()将它们导出为DER格式。
  • 将其导入到OpenSSL的
  • 利润

或者,你可以走另外一条道路:

  • 转换证书使用OpenSSL为DER
  • 创建SecCertificateRefSecCertificateCreateWithData()
  • 创建a SecPolicyRefSecPolicyCreateSSL()
  • 创建SecTrustRefSecTrustCreateWithCertificates()
  • SecTrustEvaluate()
  • 利润

或者当然你也可以管理与NSURLConnectionCFNetwork SSL连接(可直接在C++),该系统将尽一切评估为你自动。只要有可能,我建议不要在iOS上使用OpenSSL,因为它会产生很多复杂性。但是,如果需要,上面的内容应该可以帮助你弥合。

+0

我试过了,但我没有得到任何匹配(请检查我的编辑)。 – 2012-04-09 14:26:43

+0

对不起; Mac OS X在大脑中。在iOS中,除了应用程序钥匙串以外,您无权访问任何钥匙串。所以你不能从设备上获得证书列表。您可以使用我链接的列表(HT5012)来查找设备上的正常情况,但它不提供完整的证书。通常情况下,您不需要“任何”根目录,只需要根证书,以便您可以直接发布这些根目录。但是,除此之外,您可以从Mac导出证书并将其与您的产品一起发货,或者您可以使用上述第二种方法。 – 2012-04-09 14:46:48

+0

问题是用户不会连接到我的服务器,而是连接到其他服务器,并且我想验证它是否具有有效的SSL证书(我无法预先预测哪个是我要验证根证书的原因) 。无论如何,我想我会尝试第二种方法,并在可能的情况下切换我的代码以使用本地呼叫,这将为我处理SSL验证。谢谢。 – 2012-04-09 17:58:54

1

有几种分发证书的方法。使用电子邮件 - 发送证书作为附件,点击它将开始安装过程。或者使用浏览器 - 将Safari导航到承载证书的页面,下载并安装。您还可以使用配置配置文件来简化部署。

阅读更多关于iPad in Business的信息,向下滚动至Distributing and Installing Certificates部分。

编辑:证书查询

要找到可以使用SecItemCopyMatching提供kSecClassCertificatekSecAttrLabel一个钥匙串项目。结帐Finding a Certificate In the KeychainCertificate, Key, and Trust Services Tasks for iOS

+0

我知道如何加载提供的证书,我的问题是如何加载现有的根证书。我不希望将证书与我的应用捆绑在一起,我想使用苹果的应用。 – 2012-04-07 08:47:10

+0

我误解了你的问题。看看我的编辑关于'SecItemCopyMatching'可以帮助你。 – tenorsax 2012-04-08 00:22:47

+0

我试过了,但没有得到任何匹配(请查看我的编辑)。 – 2012-04-09 14:27:00