iOS15/Xcode13模拟器调用SecKeyCreateRandomKey无法生成私钥如何解决?
错误原因
错误码-25293对应钥匙串的errSecAuthFailed错误,触发原因如下:
- 你的密钥配置中使用了
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly访问保护等级,同时添加了.userPresence校验标记,这两个配置都要求设备必须设置锁屏密码才能正常将密钥持久化存储到钥匙串中。 - iOS 15版本的模拟器默认未设置锁屏密码,钥匙串不支持需要设备密码校验的持久化密钥存储,当你将
kSecAttrIsPermanent设为true要求持久化存储密钥时,就会触发权限校验失败。
修复方案
你可以根据开发需求选择以下任意一种方案:
方案1:给模拟器设置锁屏密码(保留原有配置不变)
打开模拟器的「设置」-「面容ID与密码/触控ID与密码」,点击「开启密码」设置任意简单密码即可,设置完成后重新运行代码即可正常生成密钥。方案2:开发环境下区分模拟器和真机,使用差异化配置
可以在编译时判断运行环境,模拟器下使用更宽松的访问控制规则,示例代码如下:let isSimulator = TARGET_OS_SIMULATOR != 0 let accessibleAttribute = isSimulator ? kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly : kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly let accessControlFlags: SecAccessControlCreateFlags = isSimulator ? [] : .userPresence let accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, accessibleAttribute, accessControlFlags, nil ) return [ kSecAttrKeyType: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits: keySizeInBits, kSecPrivateKeyAttrs: [ kSecAttrIsPermanent: true, kSecAttrApplicationTag: encoded(tag: tag), kSecAttrAccessControl: accessControl as Any, ], ]方案3:临时取消密钥持久化存储
如果不需要在测试过程中保留密钥,可将kSecAttrIsPermanent设为false,生成的密钥仅存于内存中,不会触发钥匙串的权限校验,也可规避该错误。
内容的提问来源于stack exchange,提问作者Michał Ziobro
相关产品推荐
相关产品推荐

