Macos 将私钥导入密钥链将返回EINVAL错误

Macos 将私钥导入密钥链将返回EINVAL错误,macos,cocoa,keychain,Macos,Cocoa,Keychain,我正在尝试使用我的应用程序将RSA私钥导入密钥链。第一次使用SecKeychainImport()导入密钥时,操作成功,随后的导入会给我一个EINVAL(100022)错误 如果在两次导入之间退出并重新启动应用程序,则不会发生这种情况。我包括下面的源代码 是否缺少任何明显的内容?尝试在params.keyAttribute中设置CSSM\u KEYATTR\u PERMANENT位。在Lion上,如果显式设置此属性,我可以将多个PEM铠装RSA私钥(使用openssl genrsa生成)导入密钥

我正在尝试使用我的应用程序将RSA私钥导入密钥链。第一次使用SecKeychainImport()导入密钥时,操作成功,随后的导入会给我一个EINVAL(100022)错误

如果在两次导入之间退出并重新启动应用程序,则不会发生这种情况。我包括下面的源代码


是否缺少任何明显的内容?

尝试在params.keyAttribute中设置
CSSM\u KEYATTR\u PERMANENT
位。在Lion上,如果显式设置此属性,我可以将多个PEM铠装RSA私钥(使用
openssl genrsa
生成)导入密钥链。如果不这样做,则在导入第一个键时会得到
errSecItemNotFound
(-25300)


(不要忘记在代码中删除代码)KSKEKNONOAccess控件<代码>。如果你自己生成密钥,请考虑使用<代码> ScKeGebug /Case> SekEngEngestSysMythys。)第六个参数不应该是<代码>和PARAMS<代码>而不是NULL吗?您在哪个操作系统版本上尝试了此操作?

    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.
    }