2012-09-06 46 views
1

我正在爲我們的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。

如果需要,我可以發佈代碼和/或證書轉儲。

由於提前,

肯跨 西門子的企業網絡。

回答

0

據我所知,您正確使用SecItemCopyMatching

SecIdentityRef項目實際上並未存儲在鑰匙串上;它們是爲具有相關私鑰可用的證書動態生成的。重複的身份確實很奇怪,可能表明一個框架問題 - 也許框架會被第二組證書中的副本混淆? (請在bugreport.apple.com上提交錯誤!)重新啓動應用程序時,重複身份是否會消失?

另一方面,重複的身份不一定會導致任何實際問題。如果您擔心自己可能使用了錯誤的身份,只需詢問SecItemAdd即可持續參考其「創建」的身份,並在需要時使用該身份檢索SecIdentityRef