将私钥导入钥匙串出现EINVAL错误

4

我正在尝试使用我的应用程序将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.
    }

我是否漏掉了任何显而易见的东西?


第六个参数应该是&params而不是NULL吧? - Karoy Lorentey
还有,您是在哪个操作系统版本上尝试过这个? - Karoy Lorentey
1个回答

3
尝试在params.keyAttribute中设置CSSM_KEYATTR_PERMANENT位。在Lion上,如果我明确设置了此属性,我可以将多个使用openssl genrsa生成的PEM-armoured RSA私钥导入到钥匙串中。如果我没有设置,当导入第一个密钥时,会出现errSecItemNotFound(-25300)错误。
(部署此代码之前,请不要忘记删除kSecKeyNoAccessControl。另外,如果您自己生成密钥,请考虑改用SecKeyGenerate / SecKeyGenerateSymmetric。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接