CSSMERR_DL_DATASTORE_DOESNOT_EXIST при попытке импортировать закрытый ключ в цепочку для ключей - PullRequest
0 голосов
/ 17 мая 2019

В моем приложении я пытаюсь импортировать закрытый ключ в цепочку ключей входа. Для этого я создаю все атрибуты в словаре.

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);

Поскольку я добавляю ключ в цепочку ключей входа в систему, я получаю путь к цепочке ключей входа в систему и создаю SecKeyChainRef для того же самого, используя SecKeychainOpen.

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);

Чтобы наконец добавить приватный ключ, который хранился в 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 и хотел бы выяснить, почему это происходит. Пытаясь исследовать эту проблему, я наткнулся на темы, в которых упоминается призрачная цепочка для ключей , но я подтвердил, что на этот раз это не так.

...