首页 > 解决方案 > 向 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 错误(重复项目已存在)。

我不知道为什么或如何从该位置加载或删除密钥都失败了,而保存是声明该位置已被占用。

有什么见解吗?我已经尝试过对一些我以前从未使用过的随机标签进行硬编码,但它们也会出现重复输入错误。

标签: iosswiftkeychain

解决方案


我找到了两个解决方案:

  1. 稍后请求特定键的值。使用异步延迟。有时,钥匙串不会提供 -25300 的结果。钥匙串也是一个 SQLite 数据库。看来数据库当前很忙。所以,稍后再请求数据。
  2. 您已经在此密钥中写入了一些内容,但是您使用了另一个保护级别。为避免这种情况,请使用名称中包含保护级别的密钥。例如,someKey进入someKey-afterFirstUnlock

推荐阅读