Импорт закрытого ключа в связку ключей возвращает ошибку EINVAL - PullRequest
3 голосов
/ 23 декабря 2011

Я пытаюсь импортировать закрытые ключи RSA в связку ключей, используя мое приложение. В первый раз, когда я импортирую ключ с помощью SecKeychainImport (), операция прошла успешно, последующий импорт выдает ошибку EINVAL (100022).

Этого не произойдет, если я выйду и перезапущу приложение между двумя операциями импорта. Я включаю исходный код ниже.

    CFArrayRef array = (CFArrayRef)[NSMutableArray array];

    SecExternalFormat format = kSecFormatUnknown;

    //We are always storing a private key…
    SecExternalItemType type = kSecItemTypePrivateKey;

    SecKeyImportExportParameters params;

    SecKeychainRef keychain;

    SecKeychainCopyDefault(&keychain);

    memset(&params, 0, sizeof(params));

    params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION;
    params.flags = kSecKeyNoAccessControl;
    params.keyUsage = CSSM_KEYUSE_ANY;
    params.keyAttributes = CSSM_KEYATTR_EXTRACTABLE;

    err = SecKeychainItemImport((CFDataRef)data,
                                         (CFStringRef)@"pem",
                                         &format,
                                         &type,
                                         0,
                                         NULL,
                                         keychain,
                                         &array);
    if(err == noErr)
    {
        //Change the kSecKeyPrintName attribute of the keychain item.
    }

    else
    {
        //Handle the error by displaying appropriate alert.
    }

Я что-то упускаю из виду?

1 Ответ

2 голосов
/ 24 декабря 2011

Попробуйте установить CSSM_KEYATTR_PERMANENT бит в params.keyAttribute.На Lion я могу импортировать несколько закрытых ключей RSA в броне PEM (сгенерированных с помощью openssl genrsa) в цепочку для ключей, если я явно установлю этот атрибут.В противном случае я получаю errSecItemNotFound (-25300) при импорте самого первого ключа.

(Не забудьте удалить kSecKeyNoAccessControl перед развертыванием этого кода в рабочей среде. Кроме того, если вы генерируетесам ключ, рассмотрите возможность использования SecKeyGenerate / SecKeyGenerateSymmetric.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...