我正在为我们的 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 西门子企业网络。