首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果删除,则向iOS密钥链-25300 (未找到)发出保存证书,但如果添加-25299 (重复项),则颁发-25299证书

如果删除,则向iOS密钥链-25300 (未找到)发出保存证书,但如果添加-25299 (重复项),则颁发-25299证书
EN

Stack Overflow用户
提问于 2019-10-01 21:10:23
回答 2查看 549关注 0票数 2

我在苹果的钥匙链上碰到了一个有趣的问题,我想知道我做错了什么。

代码语言:javascript
复制
    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则声明该位置已被占用。

有洞察力吗?我尝试过硬编码一些我以前从未使用过的随机标签,它们也会产生重复的输入错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-02 22:19:36

我试了很多东西,但都没有用。我最终发现kSecCertificate类使用颁发者和序列号属性来计算其uniqueId。

因为我使用的是自签名证书,所以SecCertificateCreateWithData操作失败,结果为零。我相信这会导致我所有的证书都被计算成相同的空id。我尝试将相同的数据存储在kSecGenericPassword中,并设置了一个不同的帐户属性,问题已经解决了。

票数 0
EN

Stack Overflow用户

发布于 2019-10-01 21:30:14

我找到了两个解决方案:

稍后,

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

中的someKey

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58192311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档