我正在尝试使用我的应用程序将 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(¶ms, 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/