在iOS上访问Apple的根证书

Gil*_*vik 5 security openssl certificate keychain ios

我找到了以下代码: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);
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 3

你会想要这样的东西:

  • SecItemCopyMatching()使用kSecMatchTrustedOnlyset to查找证书kCFBooleanTrue。请记住,这将是很多证书,而不仅仅是一个。
  • 然后将它们导出为 DER 格式SecCertificateCopyData()
  • 将它们导入 OpenSSL
  • 利润

或者,您也可以采用另一种方式:

  • 使用 OpenSSL 将证书转换为 DER
  • 创建一个SecCertificateRefSecCertificateCreateWithData()
  • 创建一个SecPolicyRefSecPolicyCreateSSL()
  • 创建一个SecTrustRefSecTrustCreateWithCertificates()
  • 评估与SecTrustEvaluate()
  • 利润

或者当然您也可以使用NSURLConnection或 with来管理 SSL 连接CFNetwork(直接在 C++ 中可用),系统会自动为您完成所有操作。只要有可能,我建议不要在 iOS 上使用 OpenSSL,因为它会带来很大的复杂性。但如果您需要的话,上述内容应该可以帮助您建立桥梁。