首页 > 解决方案 > CSSMERR_DL_DATASTORE_DOESNOT_EXIST 尝试将私钥导入钥匙串

问题描述

使用我的应用程序,我正在尝试将私钥导入登录钥匙串。为此,我在字典中创建了所有属性。

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:(__bridge id)kSecAttrKeyTypeRSA
               forKey:(__bridge id)kSecAttrKeyType];
[attributes setObject:(__bridge id)kSecAttrKeyClassPrivate
               forKey:(__bridge id)kSecAttrKeyClass];
[attributes setObject:[NSNumber numberWithLong:(2048)]
               forKey:(__bridge id)kSecAttrKeySizeInBits];

然后使用为密钥创建一个 SecKeyRef

SecKeyRef privateKey = SecKeyCreateFromData((CFDictionaryRef)attributes, (CFDataRef)encodedPrivateKeyData, &error);

由于我将密钥添加到登录钥匙串,因此我派生了登录钥匙串的路径并使用 SecKeychainOpen 为其创建一个 SecKeyChainRef。

NSArray *path = [NSHomeDirectory() pathComponents];
//returns /Users/<username>/Library/...
NSString *keychainPath = [NSString stringWithFormat:@"%@%@/%@%@",path[0],path[1],path[2],@"/Library/Keychains/login.keychain"];
SecKeychainRef keychain = NULL;
OSStatus status = SecKeychainOpen([keychainPath UTF8String],&keychain);

一旦我们有了 privateKey 和 keychainRef,我们实际上可以使用创建 privateKey 的表示

CFDataRef exportData = NULL;
status = SecItemExport(privateKey, kSecFormatWrappedPKCS8, 0, &keyParams, &exportData);

为了最终添加存储在的 privateKey exportData,我使用

CFArrayRef outItems = NULL;
status = SecItemImport(exportData, NULL, &dataFormat, &actualType, 0, &keyParams, keychain, &outItems);

SecItemImport 出现问题,我得到 OSStatus -25294 errSecNoSuchKeychain - "The specified keychain could not be found" CSSM Error: Keychain Access CSSM Exception: -2147413737 CSSMERR_DL_DATASTORE_DOESNOT_EXIST 奇怪的是,SecKeychainOpen 和 SecItemImport 函数都使用登录钥匙串的相同 SecKeychainRef,但应用程序只能在 SecKeychainOpen 函数期间成功找到钥匙串。它仅在 SecItemImport 操作期间失败。由于它是保存了很多密码的登录钥匙串,我想找出一个解决方案,如果可能的话,不必重置钥匙串。

这是一个孤立的事件,我只在一台 Mac 上看到过,想弄清楚为什么会发生这种情况。试图研究这个问题时,我遇到了提到幽灵钥匙串的线程,但我已经确认这次不是这种情况。

标签: objective-cmacoskeychainprivate-key

解决方案


推荐阅读