ios - 向 iOS 钥匙串发出保存证书 -25300(未找到)如果删除,但 -25299(重复项)如果添加
问题描述
我在 Apple 钥匙串上遇到了一个有趣的问题,我想知道我做错了什么。
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 错误(重复项目已存在)。
我不知道为什么或如何从该位置加载或删除密钥都失败了,而保存是声明该位置已被占用。
有什么见解吗?我已经尝试过对一些我以前从未使用过的随机标签进行硬编码,但它们也会出现重复输入错误。
解决方案
我找到了两个解决方案:
- 稍后请求特定键的值。使用异步延迟。有时,钥匙串不会提供 -25300 的结果。钥匙串也是一个 SQLite 数据库。看来数据库当前很忙。所以,稍后再请求数据。
- 您已经在此密钥中写入了一些内容,但是您使用了另一个保护级别。为避免这种情况,请使用名称中包含保护级别的密钥。例如,
someKey
进入someKey-afterFirstUnlock
推荐阅读
- python - 在同一个图上对 scatter 和 contourf 使用相同的颜色
- java - 如何使用新的导航图将过渡应用于片段?
- .htaccess - 如何重定向到具有多个域的 .htaccess 文件中的子域
- python-3.x - DjangoRestFramework - 具有多个项目的 URI(在列表视图和详细视图之间交叉)
- java - 多个组件的复杂布局
- python - 如何使用 python selenium 登录 Openload.co?
- go - Go 中的覆盖范围
- android - 如何在视图后面显示 AutoCompleteTextView 的下拉列表?
- loops - 了解带有 in (%variable1%, %variable2%...) 的循环批处理
- spring - 使用 @Lazy 时创建 Bean 和初始化 Bean 的区别