我在苹果的钥匙链上碰到了一个有趣的问题,我想知道我做错了什么。
func saveCert(accessGroup: String? = nil, certData: Data, label: String? = nil) -> Error? {
var query = createKeychainAddQueryDict()
if let accessGroup = accessGroup {
query[String(kSecAttrAccessGroup)] = accessGroup
}
query[String(kSecValueData)] = certData
query[String(kSecClass)] = kSecClassCertificate
if let label = label {
query[String(kSecAttrLabel)] = label
}
var status = SecItemDelete(query as CFDictionary)
if status != noErr {
print("Error deleting cer from keychain. Error: \(status)")
}
let resultCode = SecItemAdd(query as CFDictionary, nil)
return getErrorFromKeychainCode(code: resultCode)
}我正在保存一个自我签名的证书,但是我已经验证了每个项目的序列号都是不同的。
当我尝试删除证书时,我会得到一个-25300错误(无法找到项),但是当我试图保存到密钥链中时,我会得到一个-25299错误(重复项已经存在)。
我感到困惑的是,为什么或如何从该位置加载或删除密钥都失败了,而taken则声明该位置已被占用。
有洞察力吗?我尝试过硬编码一些我以前从未使用过的随机标签,它们也会产生重复的输入错误。
发布于 2019-10-02 22:19:36
我试了很多东西,但都没有用。我最终发现kSecCertificate类使用颁发者和序列号属性来计算其uniqueId。
因为我使用的是自签名证书,所以SecCertificateCreateWithData操作失败,结果为零。我相信这会导致我所有的证书都被计算成相同的空id。我尝试将相同的数据存储在kSecGenericPassword中,并设置了一个不同的帐户属性,问题已经解决了。
发布于 2019-10-01 21:30:14
我找到了两个解决方案:
稍后,
someKey-afterFirstUnlock中的someKey
https://stackoverflow.com/questions/58192311
复制相似问题