Ios 如何从钥匙链获取数字身份?

Ios 如何从钥匙链获取数字身份?,ios,swift,security,keychain,ios13,Ios,Swift,Security,Keychain,Ios13,我在遵循苹果公司的教程: 及 关于如何从钥匙链存储和检索身份 存储标识似乎工作正常,errSecSuccess返回。但是,当尝试获取任何身份时,我会返回errSecItemNotFound(或-25300) 即使卸下钥匙链也不能像预期的那样工作;成功添加标识后,SecItemCopyMatching仍然返回errSecItemNotFound 请参阅与文档中提供的摘录非常匹配的以下代码片段: //将数字身份存储在钥匙链中: let addQuery:[String:Any]=[kSecClas

我在遵循苹果公司的教程:

关于如何从钥匙链存储和检索身份

存储标识似乎工作正常,
errSecSuccess
返回。但是,当尝试获取任何身份时,我会返回
errSecItemNotFound
(或
-25300

即使卸下钥匙链也不能像预期的那样工作;成功添加标识后,
SecItemCopyMatching
仍然返回
errSecItemNotFound

请参阅与文档中提供的摘录非常匹配的以下代码片段:

//将数字身份存储在钥匙链中:
let addQuery:[String:Any]=[kSecClass as String:kSecClassIdentity,
kSecValueRef作为字符串:标识,
kSecAttrLabel作为字符串:“myid”]
guard SecItemAdd(addQuery as CFDictionary,nil)==errSecSuccess-else{
打印(“无法在钥匙链中存储身份”)
返回错误
}
//从钥匙链获取数字身份:
let getQuery:[String:Any]=[kSecClass as String:kSecClassIdentity,
kSecAttrLabel作为字符串:“myid”,
kSecReturnRef作为字符串:kCFBooleanTrue!]
变量项:CFTypeRef?
let status=SecItemCopyMatching(getQuery为CFDictionary,&item)
防护状态==errSecSuccess-else{

print(“在keychain中找不到身份,OSerror:\(status)”/我终于自己找到了答案

在标识上使用标签很棘手,因为标识不是作为原子项存储在密钥链中,而是作为单独的私钥和证书存储,并且这些项以不同的方式使用标签

即:

  • 将身份添加到钥匙链时,将
    kSecReturnPersistentRef
    传递到
    SecItemAdd
  • 将持久引用保存到任何位置
  • 稍后,当您需要返回标识时,使用该持久引用调用
    SecItemCopyMatching

  • 这是有道理的,我终于能够用这种方式解决我的问题。

    对不起..我没有弄清楚我的意思..创建
    标识的代码在哪里?为什么是字符串?不用担心,标识是从p12文件导入的。但是,我认为这不重要,因为SecItemAdd返回了errSecSuccess。你怎么会这样呢ink这是一个字符串?@Brandon这是一个SecIdentity。当你从密钥链检索证书时,你需要使用
    kSecClass:kSecClassCertificate
    啊,你确定吗?苹果的文档说了一些不同的东西。这不是我想从密钥链获取的证书,而是一个数字身份。这既是证书又是私钥。为什么?我会试试。@BrandonWell然后我很困惑,因为代码显示的是
    “mycert”
    ,所以我假设这是一个输入错误,您存储的是身份而不是证书。