在iOS上访问Apple的根证书

时间:2012-03-30 17:26:45

标签: ios security openssl certificate keychain

我找到了以下代码:https://github.com/roddi/ValidateStoreReceipt/blob/master/validatereceipt.m,它在MacOS上加载根证书('Apple Root 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);

2 个答案:

答案 0 :(得分:3)

你会想要这些内容:

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

或者,你可以采取另一种方式:

  • 使用OpenSSL将证书转换为DER
  • 使用SecCertificateRef
  • 创建SecCertificateCreateWithData()
  • 使用SecPolicyRef
  • 创建SecPolicyCreateSSL()
  • 使用SecTrustRef
  • 创建SecTrustCreateWithCertificates()
  • 使用SecTrustEvaluate()
  • 进行评估
  • 利润

当然,您也可以使用NSURLConnectionCFNetwork(直接在C ++中使用)管理SSL连接,系统会自动为您完成所有操作。只要有可能,我建议不要在iOS上使用OpenSSL,因为它会产生很多复杂性。但如果你需要,上述内容可以帮助你弥补。

答案 1 :(得分:1)

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

iPad in Business中详细了解相关内容,向下滚动至Distributing and Installing Certificates部分。

编辑:证书查询

要查找钥匙串项,您可以使用提供kSecClassCertificatekSecAttrLabel的{​​{3}}。 SecItemCopyMatching

中的结帐Finding a Certificate In the Keychain