我正在爲我們的iPhone應用程序實施SSL客戶端身份驗證,並且正在使用應用程序鑰匙串來存儲客戶端身份(證書+私鑰)。將項目添加到鑰匙串後,我在使用SecItemCopyMatching時遇到了一些意想不到的結果。快速總結:我將恰好一個SecIdentityRef添加到鑰匙串,但SecItemCopyMatching後來找到兩個。讓我從事實開始。SecItemCopyMatching返回比使用SecItemAdd添加的更多SecIdentityRef項目
我使用iOS 4.3.5在iPod上運行我的應用程序。
我有一個空的應用程序鑰匙串開始。
我的證書全部使用openssl創建,並通過PKCS#12文件作爲電子郵件附件部署到iPod。 的PKCS#12文件包含:
- 客戶端證書
- 客戶端CA證書(客戶端證書的頒發者)
- 根CA證書(客戶端CA證書的發行人)
- RSA私鑰客戶端證書
SecPKCS12Import成功導入的文件,並將生成字典有以下內容:
- 一個 「同一性」
- 一個 「信任」
- 一個 「鏈」(CFArray其保持上述三個證書)
使用SecItemAdd,我成功添加 「同一性」 來鑰匙扣。
接下來,我從字典中檢索「chain」數組並嘗試添加證書。這樣做,第一個失敗,錯誤errSecDuplicateItem。我認爲這是因爲第一個證書是客戶端證書,並且在添加標識時已經將其添加到鑰匙串中。另外兩個證書添加沒有錯誤。
現在,如果我回去使用SecItemCopyMatching這些鍵/值對...
keys = {kSecClass, kSecReturnRef, kSecMatchLimit}
values = {kSecClassIdentity, kCFBooleanTrue, kSecMatchLimitAll}
...兩個身份返回!此外,如果我檢索每個(SecIdentityCopyCertificate)證書,然後彙總(SecCertificateCopySubjectSummary),我看到了這兩個身份有相同的證書!
最後,當我嘗試從鑰匙扣(SecItemDelete)明確的身份,第一次嘗試是成功的,但第二個失敗,errSecItemNotFound。
它是從所有的谷歌搜索清楚,我一直在做,有「問題」與iOS的鑰匙串。但是,我沒有看到這個報道;我也沒有看到任何相關的東西。
所以,我的問題:
- 我使用正確SecItemCopyMatching?
- 當使用SecItemCopyMatching查找鑰匙串中的身份時,它如何確定存在的身份?這是動態的,還是嚴格基於添加了多少個SecIdentityRef項目?
- 這個問題可能與證書本身有關嗎?請注意,儘管存在此問題,我仍然可以檢索第一個身份和證書以響應didReceiveAuthenticationChallenge。
如果需要,我可以發佈代碼和/或證書轉儲。
由於提前,
肯跨 西門子的企業網絡。