objective-c - 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 上看到过,想弄清楚为什么会发生这种情况。试图研究这个问题时,我遇到了提到幽灵钥匙串的线程,但我已经确认这次不是这种情况。
解决方案
推荐阅读
- knockout.js - 如何根据使用 knockout.js 中的数据绑定的条件将值绑定到 colspan?
- matrix - `matrix * vector`、`matrix' * vector` 和 `copy(matrix') * vector` 之间的非直观性能差异
- c# - WPF 控件库面向 .NET Core 3 还是 .NET Framework?
- regex - 如何在不使用时将 Visual Studio Code 查找小部件设置为“使用正则表达式”,并在使用时将其关闭 - 从扩展
- jenkins - 在 Jenkins 共享库基础架构中,如何在另一个文件中导入类?
- youtube-api - 限制 Youtube API WordPress 插件的问题
- javascript - 在组件之间传递数据并使用 ngDocheck
- r - 在 R igraph 中绘制社区对象时更改顶点颜色
- python - 由于 csv 的引号 char + delim + 间歇性空白而无法读取 csv
- javascript - 修改数组对象的元素属性时,Redux 存储未更新