macos - 将私钥导入钥匙串(keychain)返回 EINVAL 错误

标签 macos cocoa keychain

我正在尝试使用我的应用程序将 RSA 私钥导入到钥匙串(keychain)中。第一次使用 SecKeychainImport() 导入 key 时,操作成功,随后的导入出现 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.keyAttribute 中设置 CSSM_KEYATTR_PERMANENT 位。在 Lion 上,如果我显式设置此属性,我可以将多个 PEM 装甲 RSA 私钥(使用 openssl genrsa 生成)导入到钥匙串(keychain)中。如果不这样做,我会在导入第一个 key 时收到 errSecItemNotFound (-25300)。

(在生产中部署此代码之前,不要忘记删除 kSecKeyNoAccessControl。另外,如果您自己生成 key ,请考虑使用 SecKeyGenerate/SecKeyGenerateSymmetric 相反。)

关于macos - 将私钥导入钥匙串(keychain)返回 EINVAL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8614794/

相关文章:

cocoa - 如何检查应用程序是否已注册以处理 macOS 上的特定 URL 方案?

ios - 如果安装了 App B,则解锁 App A 中的功能

xcode - codesign 的多个弹出窗口想要访问钥匙串(keychain)中的 key "access"

macos - 如何在 NSPasteBoard cocoa os x 中复制图像?

ruby - 如何让RVM自动使用默认值

php - 在 Mac OS X 10.5.8 上为 PHP 安装 Mcrypt 扩展

ios - Apple Watch 的已知 WiFi 网络?

linux - 使用 GUI 开发程序

objective-c - 获取垃圾桶的全尺寸图标

objective-c - 如何暂停/继续 NSThread