SecItemCopyMatching返回的SecIdentityRef项比使用SecItemAdd添加的项更多

时间:2012-09-06 18:10:21

标签: ios security ssl keychain

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

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

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

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

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

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

  • 一个"身份"
  • one" trust"
  • one" chain" (CFArray持有上述三个证书)

使用SecItemAdd,我成功添加了"身份"到钥匙串。

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

现在,如果我回去使用这些键/值对的SecItemCopyMatching ......

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

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

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

从我所做的所有谷歌搜索中可以清楚地看出,存在"问题"使用iOS钥匙串。但是,我没有看到这个报道;我也没见过任何与之相关的东西。

所以,我的问题:

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

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

提前致谢,

肯克罗斯 西门子企业网络。

1 个答案:

答案 0 :(得分:0)

据我所知,您正确使用SecItemCopyMatching

SecIdentityRef项目实际上并未存储在钥匙串中;它们是为具有相关私钥的证书动态生成的。重复的身份确实很奇怪,可能表明一个框架问题 - 也许框架会被第二组证书中的副本搞糊涂? (请在bugreport.apple.com上提交一个错误!)当您重新启动应用程序时,重复的身份是否会消失?

另一方面,重复身份不一定会导致任何实际问题。如果您担心自己可能使用了错误的身份,只需要SecItemAdd提供对其所创建的身份的持久性引用"并在需要时使用它来检索SecIdentityRef