我正在为我们的iPhone应用程序实施SSL客户端身份验证,并使用应用程序密钥链来存储客户端身份(证书+私钥)。将项目添加到钥匙串后,使用SecItemCopyMatching时我得到了一些意想不到的结果。快速摘要:我只在Keychain中添加了一个SecIdentityRef,但SecItemCopyMatching后来找到了两个。让我从事实开始。
我在iOS 4.3.5的iPod上运行我的应用程序。
我有一个空的应用程序钥匙串。
我的证书都是使用openssl创建的,并通过PKCS#12文件作为电子邮件附件部署到iPod。 PKCS#12文件包含:
SecPKCS12Import成功导入文件,生成的字典具有以下内容:
使用SecItemAdd,我成功添加了"身份"到钥匙串。
接下来,我检索"链"字典中的数组并尝试添加证书。这样做时,第一个失败并出现错误errSecDuplicateItem。我认为这是因为第一个证书是客户端证书,并且当我添加身份时它已经添加到钥匙串中。添加其他两个证书时没有错误。
现在,如果我回去使用这些键/值对的SecItemCopyMatching ......
keys = {kSecClass, kSecReturnRef, kSecMatchLimit}
values = {kSecClassIdentity, kCFBooleanTrue, kSecMatchLimitAll}
......返回两个身份!此外,如果我检索每个证书(SecIdentityCopyCertificate)然后检索摘要(SecCertificateCopySubjectSummary),我看到两个身份都有相同的证书!
最后,当我尝试从钥匙串(SecItemDelete)清除身份时,第一次尝试成功但第二次尝试失败并使用errSecItemNotFound。
从我所做的所有谷歌搜索中可以清楚地看出,存在"问题"使用iOS钥匙串。但是,我没有看到这个报道;我也没见过任何与之相关的东西。
所以,我的问题:
如果需要,我可以发布代码和/或证书转储。
提前致谢,
肯克罗斯 西门子企业网络。答案 0 :(得分:0)
据我所知,您正确使用SecItemCopyMatching
。
SecIdentityRef
项目实际上并未存储在钥匙串中;它们是为具有相关私钥的证书动态生成的。重复的身份确实很奇怪,可能表明一个框架问题 - 也许框架会被第二组证书中的副本搞糊涂? (请在bugreport.apple.com上提交一个错误!)当您重新启动应用程序时,重复的身份是否会消失?
另一方面,重复身份不一定会导致任何实际问题。如果您担心自己可能使用了错误的身份,只需要SecItemAdd
提供对其所创建的身份的持久性引用"并在需要时使用它来检索SecIdentityRef
。