我正在尝试使用我的应用程序将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(¶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. }
我错过了什么明显的东西吗?
答案 0 :(得分:2)
尝试在params.keyAttribute中设置CSSM_KEYATTR_PERMANENT
位。在Lion上,如果我明确设置了这个属性,我可以将多个PEM铠装RSA私钥(用openssl genrsa
生成)导入到钥匙串中。如果不这样做,我会在导入第一个密钥时获得errSecItemNotFound
( - 25300)。
(在生产中部署此代码之前,请不要忘记删除kSecKeyNoAccessControl
。此外,如果您自己生成密钥,请考虑改用SecKeyGenerate
/ SecKeyGenerateSymmetric
。)