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