2

我正在为我们的 iPhone 应用程序实施 SSL 客户端身份验证,并使用应用程序钥匙串来存储客户端身份(证书 + 私钥)。将项目添加到钥匙串后,我在使用 SecItemCopyMatching 时得到了一些意想不到的结果。快速总结:我将一个 SecIdentityRef 添加到钥匙串中,但 SecItemCopyMatching 之后找到了两个。让我从事实开始。

我在装有 iOS 4.3.5 的 iPod 上运行我的应用程序。

我有一个空的应用程序钥匙串开始。

我的证书都是使用 openssl 创建的,并通过 PKCS#12 文件作为电子邮件附件部署到 iPod。PKCS#12 文件包含:

  • 客户证书
  • 客户端 CA 证书(客户端证书的颁发者)
  • 根 CA 证书(客户端 CA 证书的颁发者)
  • 客户端证书的 RSA 私钥

SecPKCS12Import 成功导入文件,生成的字典有以下内容:

  • 一个“身份”
  • 一份“信任”
  • 一个“链”(CFArray 持有上述三个证书)

使用 SecItemAdd,我成功地将“身份”添加到钥匙串中。

接下来,我从字典中检索“链”数组并尝试添加证书。这样做时,第一个失败并出现错误 errSecDuplicateItem。我认为这是因为第一个证书是客户端证书,并且在我添加身份时它已经添加到钥匙串中。其他两个证书添加没有错误。

现在,如果我返回并使用 SecItemCopyMatching 与这些键/值对......

 keys   = {kSecClass, kSecReturnRef, kSecMatchLimit}
 values = {kSecClassIdentity, kCFBooleanTrue, kSecMatchLimitAll}

...返回两个身份!此外,如果我检索每个 (SecIdentityCopyCertificate) 的证书,然后检索摘要 (SecCertificateCopySubjectSummary),我看到两个身份都具有相同的证书!

最后,当我尝试从钥匙串 (SecItemDelete) 中清除身份时,第一次尝试成功,但第二次尝试失败并显示 errSecItemNotFound。

从我一直在做的所有谷歌搜索中可以清楚地看出,iOS 钥匙串存在“问题”。但是,我还没有看到这个报道;我也没有看到任何相关的东西。

所以,我的问题:

  • 我是否正确使用了 SecItemCopyMatching?
  • 在使用 SecItemCopyMatching 查找钥匙串中的身份时,它如何确定存在的身份?这是动态的,还是严格基于添加了多少 SecIdentityRef 项目?
  • 这个问题可能与证书本身有关吗?请注意,尽管存在此问题,我仍然能够检索第一个身份和证书以响应 didReceiveAuthenticationChallenge。

如果需要,我可以发布代码和/或证书转储。

提前致谢,

Ken Cross 西门子企业网络。

4

1 回答 1

0

据我所知,您使用SecItemCopyMatching正确。

SecIdentityRef items are not actually stored on the keychain; they are generated dynamically for certificates that have an associated private key available. Duplicate identities are indeed strange, and probably indicate a framework issue -- perhaps the framework gets confused by the duplicate in the second set of certificates? (Please do file a bug at bugreport.apple.com!) Does the duplicate identity go away when you restart the app?

On the other hand, duplicate identities won't necessarily lead to any actual problem. If you are worried that you might be using the wrong identity, simply ask SecItemAdd to provide a persistent reference to the one it "creates" and use that to retrieve the SecIdentityRef when needed.

于 2012-10-24T00:34:38.757 回答